<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://lugwiki.stcgrupo.es/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Le Wiki de Lug - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://lugwiki.stcgrupo.es/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Sp%C3%A9cial:Contributions/Admin"/>
	<updated>2026-08-30T07:19:48Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4723</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4723"/>
		<updated>2026-08-30T02:33:15Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://hermesatlas.com/ Hermes Atlas]&lt;br /&gt;
= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
Exemple de [[Nginx_ReverseProxy_LXC_Alpine_Linux|vhost]] :&lt;br /&gt;
&lt;br /&gt;
 server {&lt;br /&gt;
     listen 80;&lt;br /&gt;
     listen [::]:80;&lt;br /&gt;
      server_name &amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
     return 301 &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;$host$request_uri;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 server {&lt;br /&gt;
     server_name &amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
     # protection&lt;br /&gt;
     add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
     add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot; always;&lt;br /&gt;
     add_header Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot; always;&lt;br /&gt;
     add_header Permissions-Policy &amp;quot;geolocation=(), microphone=(), camera=()&amp;quot; always;&lt;br /&gt;
     add_header Strict-Transport-Security &amp;quot;max-age=31536000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
     client_max_body_size 256m;&lt;br /&gt;
 &lt;br /&gt;
     location / {&lt;br /&gt;
         proxy_set_header Upgrade           $http_upgrade;&lt;br /&gt;
         proxy_set_header Connection        &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
         proxy_set_header Host              $host;&lt;br /&gt;
         proxy_set_header X-Real-IP         $remote_addr;&lt;br /&gt;
         proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;&lt;br /&gt;
         proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
         proxy_set_header X-Forwarded-Host  $host;&lt;br /&gt;
         proxy_set_header X-Forwarded-Port  $server_port;&lt;br /&gt;
 &lt;br /&gt;
         proxy_http_version 1.1;&lt;br /&gt;
         proxy_read_timeout 3600;&lt;br /&gt;
         proxy_send_timeout 3600;&lt;br /&gt;
 &lt;br /&gt;
         proxy_pass http://&amp;lt;font color = blue&amp;gt;IP_SERVEUR_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
         # proxy_buffering off;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen [::]:443 ssl; # managed by Certbot&lt;br /&gt;
     listen 443 ssl; # managed by Certbot&lt;br /&gt;
 &lt;br /&gt;
     ssl_certificate /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/fullchain.pem;&lt;br /&gt;
     ssl_certificate_key /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/privkey.pem;&lt;br /&gt;
     include /etc/letsencrypt/options-ssl-nginx.conf;&lt;br /&gt;
 }&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Penser a mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes est accessible en HTTPS.&lt;br /&gt;
}}&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4722</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4722"/>
		<updated>2026-08-30T00:26:18Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://hermesatlas.com/ Hermes Atlas]&lt;br /&gt;
= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
Exemple de [[Nginx_ReverseProxy_LXC_Alpine_Linux|vhost]] :&lt;br /&gt;
&lt;br /&gt;
 server {&lt;br /&gt;
     listen 80;&lt;br /&gt;
     listen [::]:80;&lt;br /&gt;
      server_name &amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
     return 301 &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;$host$request_uri;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 server {&lt;br /&gt;
     server_name hermes.exemple.net;&lt;br /&gt;
 &lt;br /&gt;
     # protection&lt;br /&gt;
     add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
     add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot; always;&lt;br /&gt;
     add_header Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot; always;&lt;br /&gt;
     add_header Permissions-Policy &amp;quot;geolocation=(), microphone=(), camera=()&amp;quot; always;&lt;br /&gt;
     add_header Strict-Transport-Security &amp;quot;max-age=31536000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
     client_max_body_size 256m;&lt;br /&gt;
 &lt;br /&gt;
     location / {&lt;br /&gt;
         proxy_set_header Upgrade           $http_upgrade;&lt;br /&gt;
         proxy_set_header Connection        &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
         proxy_set_header Host              $host;&lt;br /&gt;
         proxy_set_header X-Real-IP         $remote_addr;&lt;br /&gt;
         proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;&lt;br /&gt;
         proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
         proxy_set_header X-Forwarded-Host  $host;&lt;br /&gt;
         proxy_set_header X-Forwarded-Port  $server_port;&lt;br /&gt;
 &lt;br /&gt;
         proxy_http_version 1.1;&lt;br /&gt;
         proxy_read_timeout 3600;&lt;br /&gt;
         proxy_send_timeout 3600;&lt;br /&gt;
 &lt;br /&gt;
         proxy_pass http://&amp;lt;font color = blue&amp;gt;IP_SERVEUR_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
         # proxy_buffering off;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen [::]:443 ssl; # managed by Certbot&lt;br /&gt;
     listen 443 ssl; # managed by Certbot&lt;br /&gt;
 &lt;br /&gt;
     ssl_certificate /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/fullchain.pem;&lt;br /&gt;
     ssl_certificate_key /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/privkey.pem;&lt;br /&gt;
     include /etc/letsencrypt/options-ssl-nginx.conf;&lt;br /&gt;
 }&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Penser a mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes est accessible en HTTPS.&lt;br /&gt;
}}&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4721</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4721"/>
		<updated>2026-08-30T00:25:46Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://hermesatlas.com/ Hermes Atlas]&lt;br /&gt;
= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
Exemple de [[Nginx_ReverseProxy_LXC_Alpine_Linux|vhost]] :&lt;br /&gt;
&lt;br /&gt;
 server {&lt;br /&gt;
     listen 80;&lt;br /&gt;
     listen [::]:80;&lt;br /&gt;
      server_name &amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
     return 301 &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;$host$request_uri;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 server {&lt;br /&gt;
     server_name hermes.exemple.net;&lt;br /&gt;
 &lt;br /&gt;
     # protection&lt;br /&gt;
     add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
     add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot; always;&lt;br /&gt;
     add_header Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot; always;&lt;br /&gt;
     add_header Permissions-Policy &amp;quot;geolocation=(), microphone=(), camera=()&amp;quot; always;&lt;br /&gt;
     add_header Strict-Transport-Security &amp;quot;max-age=31536000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
     client_max_body_size 256m;&lt;br /&gt;
 &lt;br /&gt;
     location / {&lt;br /&gt;
         proxy_set_header Upgrade           $http_upgrade;&lt;br /&gt;
         proxy_set_header Connection        &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
         proxy_set_header Host              $host;&lt;br /&gt;
         proxy_set_header X-Real-IP         $remote_addr;&lt;br /&gt;
         proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;&lt;br /&gt;
         proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
         proxy_set_header X-Forwarded-Host  $host;&lt;br /&gt;
         proxy_set_header X-Forwarded-Port  $server_port;&lt;br /&gt;
 &lt;br /&gt;
         proxy_http_version 1.1;&lt;br /&gt;
         proxy_read_timeout 3600;&lt;br /&gt;
         proxy_send_timeout 3600;&lt;br /&gt;
 &lt;br /&gt;
         proxy_pass http://&amp;lt;font color = blue&amp;gt;IP_SERVEUR_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
         # proxy_buffering off;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen [::]:443 ssl; # managed by Certbot&lt;br /&gt;
     listen 443 ssl; # managed by Certbot&lt;br /&gt;
 &lt;br /&gt;
     ssl_certificate /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/fullchain.pem;&lt;br /&gt;
     ssl_certificate_key /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/privkey.pem;&lt;br /&gt;
     include /etc/letsencrypt/options-ssl-nginx.conf;&lt;br /&gt;
 }&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Penser a mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-config.yml&amp;lt;/code&amp;gt; lorsque Hermes est accessible en HTTPS.&lt;br /&gt;
}}&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4720</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4720"/>
		<updated>2026-08-30T00:23:14Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://hermesatlas.com/ Hermes Atlas]&lt;br /&gt;
= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
Exemple de [[Nginx_ReverseProxy_LXC_Alpine_Linux|vhost]] :&lt;br /&gt;
&lt;br /&gt;
 server {&lt;br /&gt;
     listen 80;&lt;br /&gt;
     listen [::]:80;&lt;br /&gt;
      server_name &amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
     return 301 &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;$host$request_uri;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 server {&lt;br /&gt;
     server_name hermes.exemple.net;&lt;br /&gt;
 &lt;br /&gt;
     # protection&lt;br /&gt;
     add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
     add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot; always;&lt;br /&gt;
     add_header Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot; always;&lt;br /&gt;
     add_header Permissions-Policy &amp;quot;geolocation=(), microphone=(), camera=()&amp;quot; always;&lt;br /&gt;
     add_header Strict-Transport-Security &amp;quot;max-age=31536000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
     client_max_body_size 256m;&lt;br /&gt;
 &lt;br /&gt;
     location / {&lt;br /&gt;
         proxy_set_header Upgrade           $http_upgrade;&lt;br /&gt;
         proxy_set_header Connection        &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
         proxy_set_header Host              $host;&lt;br /&gt;
         proxy_set_header X-Real-IP         $remote_addr;&lt;br /&gt;
         proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;&lt;br /&gt;
         proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
         proxy_set_header X-Forwarded-Host  $host;&lt;br /&gt;
         proxy_set_header X-Forwarded-Port  $server_port;&lt;br /&gt;
 &lt;br /&gt;
         proxy_http_version 1.1;&lt;br /&gt;
         proxy_read_timeout 3600;&lt;br /&gt;
         proxy_send_timeout 3600;&lt;br /&gt;
 &lt;br /&gt;
         proxy_pass http://&amp;lt;font color = blue&amp;gt;IP_SERVEUR_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
         # proxy_buffering off;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen [::]:443 ssl; # managed by Certbot&lt;br /&gt;
     listen 443 ssl; # managed by Certbot&lt;br /&gt;
 &lt;br /&gt;
     ssl_certificate /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/fullchain.pem;&lt;br /&gt;
     ssl_certificate_key /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/privkey.pem;&lt;br /&gt;
     include /etc/letsencrypt/options-ssl-nginx.conf;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4719</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4719"/>
		<updated>2026-08-30T00:22:37Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://hermesatlas.com/ Hermes Atlas]&lt;br /&gt;
= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
Exemple de vhost :&lt;br /&gt;
&lt;br /&gt;
 server {&lt;br /&gt;
     listen 80;&lt;br /&gt;
     listen [::]:80;&lt;br /&gt;
      server_name &amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
     return 301 &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;$host$request_uri;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 server {&lt;br /&gt;
     server_name hermes.exemple.net;&lt;br /&gt;
 &lt;br /&gt;
     # protection&lt;br /&gt;
     add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot; always;&lt;br /&gt;
     add_header X-Frame-Options &amp;quot;SAMEORIGIN&amp;quot; always;&lt;br /&gt;
     add_header Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot; always;&lt;br /&gt;
     add_header Permissions-Policy &amp;quot;geolocation=(), microphone=(), camera=()&amp;quot; always;&lt;br /&gt;
     add_header Strict-Transport-Security &amp;quot;max-age=31536000&amp;quot; always;&lt;br /&gt;
 &lt;br /&gt;
     client_max_body_size 256m;&lt;br /&gt;
 &lt;br /&gt;
     location / {&lt;br /&gt;
         proxy_set_header Upgrade           $http_upgrade;&lt;br /&gt;
         proxy_set_header Connection        &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
         proxy_set_header Host              $host;&lt;br /&gt;
         proxy_set_header X-Real-IP         $remote_addr;&lt;br /&gt;
         proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;&lt;br /&gt;
         proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
         proxy_set_header X-Forwarded-Host  $host;&lt;br /&gt;
         proxy_set_header X-Forwarded-Port  $server_port;&lt;br /&gt;
 &lt;br /&gt;
         proxy_http_version 1.1;&lt;br /&gt;
         proxy_read_timeout 3600;&lt;br /&gt;
         proxy_send_timeout 3600;&lt;br /&gt;
 &lt;br /&gt;
         proxy_pass http://&amp;lt;font color = blue&amp;gt;IP_SERVEUR_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
         # proxy_buffering off;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen [::]:443 ssl; # managed by Certbot&lt;br /&gt;
     listen 443 ssl; # managed by Certbot&lt;br /&gt;
 &lt;br /&gt;
     ssl_certificate /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/fullchain.pem;&lt;br /&gt;
     ssl_certificate_key /etc/letsencrypt/live/&amp;lt;font color = blue&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;/privkey.pem;&lt;br /&gt;
     include /etc/letsencrypt/options-ssl-nginx.conf;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4718</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4718"/>
		<updated>2026-08-29T13:56:27Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://hermesatlas.com/ Hermes Atlas]&lt;br /&gt;
= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4717</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4717"/>
		<updated>2026-08-29T12:53:48Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Fix Temporaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4716</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4716"/>
		<updated>2026-08-29T12:53:21Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Fix Temporaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le docker-compose.yml remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4715</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4715"/>
		<updated>2026-08-29T12:53:12Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Fix Temporaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le docker-compose.yaml remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4714</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4714"/>
		<updated>2026-08-29T12:50:57Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_Temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le docker-compose.yaml remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt; puis déployer le conteneur avec la commande &amp;lt;code&amp;gt;docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4713</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4713"/>
		<updated>2026-08-29T12:50:30Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte = Au moment d&#039;écrire ce tutoriel l&#039;accès au Dashboard et à la page MCP ne fonctionne plus avec la version officielle du conteneur, voir [[Hermes#Fix_temporaire|cette procédure]] pour le patcher.&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le docker-compose.yaml remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt; puis déployer le conteneur avec la commande &amp;lt;code&amp;gt;docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4712</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4712"/>
		<updated>2026-08-29T12:47:36Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
==== Fix Temporaire ====&lt;br /&gt;
On construit une version patché du conteneur :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/outsourc-e/hermes-workspace.git&lt;br /&gt;
 # cd hermes-workspace&lt;br /&gt;
 # git fetch origin pull/758/head:pr-758&lt;br /&gt;
 # git fetch origin pull/735/head:pr-735&lt;br /&gt;
 # git checkout -b hermes-fixed origin/main&lt;br /&gt;
 # git cherry-pick f7a50c5dcad8ba0f88e8d29e6f85c60b07681362&lt;br /&gt;
 # git cherry-pick 36b7192&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
&lt;br /&gt;
Dans le docker-compose.yaml remplacer &amp;lt;code&amp;gt;image: ghcr.io/outsourc-e/hermes-workspace:latest&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;image: hermes-workspace:fixed&amp;lt;/code&amp;gt; puis déployer le conteneur avec la commande &amp;lt;code&amp;gt;docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4711</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4711"/>
		<updated>2026-08-29T12:19:06Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Hermes Workplace */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace&lt;br /&gt;
 # vi /opt/hermes-workspace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_USERNAME: &amp;quot;&amp;lt;font color = green&amp;gt;admin&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE_DASHBOARD&amp;lt;/font&amp;gt;&amp;quot;      &lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workspace/docker-compose.yml --project-directory /opt/hermes-workspace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4710</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4710"/>
		<updated>2026-08-29T11:38:59Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; autorise l’utilisation du cookie de session de Hermes Workspace sur une connexion HTTP non chiffrée. Cette configuration convient uniquement à un réseau local de confiance ou protégé par VPN/firewall. Si Hermes Workspace est exposé en HTTPS, mettre &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4709</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4709"/>
		<updated>2026-08-29T11:37:26Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
 &lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4708</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4708"/>
		<updated>2026-08-29T11:36:56Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_UID: 1000&lt;br /&gt;
       HERMES_GID: 1000&lt;br /&gt;
&lt;br /&gt;
       COOKIE_SECURE: &amp;quot;&amp;lt;font color = blue&amp;gt;0&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./hermes-workspace-data:/home/workspace/.hermes&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4707</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4707"/>
		<updated>2026-08-29T11:16:37Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Activer le Dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4706</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4706"/>
		<updated>2026-08-29T11:15:33Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Activer le Dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 # Attendre que l&#039;API Hermes soit réellement disponible&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&amp;lt;br&amp;gt;&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4705</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4705"/>
		<updated>2026-08-29T11:14:20Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Activer le Dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 # Attendre que l&#039;API Hermes soit réellement disponible&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte = Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_GATEWAY_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse à laquelle le Gateway Hermes est accessible.&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;&amp;lt;font color = blue&amp;gt;IP_DASHBOARD&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le Dashboard doit écouter. Utiliser une adresse précise plutôt que 0.0.0.0 permet de limiter son exposition au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4704</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4704"/>
		<updated>2026-08-29T11:06:45Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Activer le Dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On crée un service systemd pour lancer automatiquement le Dashboard après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Dashboard&lt;br /&gt;
 Requires=hermes-gateway.service&lt;br /&gt;
 After=hermes-gateway.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 WorkingDirectory=/root&lt;br /&gt;
 &lt;br /&gt;
 # Attendre que l&#039;API Hermes soit réellement disponible&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;until /usr/bin/curl -fsS http://IP_HERMES:8642/health &amp;gt;/dev/null; do sleep 1; done&#039;&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/root/.local/bin/hermes dashboard --host IP_HERMES --port 9119 --no-open&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte = Remplacer &amp;lt;code&amp;gt;IP_HERMES&amp;lt;/code&amp;gt; par l’adresse IP de l’interface réseau sur laquelle Hermes doit écouter. L’utilisation de l’adresse de l’interface plutôt que &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; permet de limiter l’exposition du Dashboard au réseau souhaité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On recharge la configuration systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
On active le service au démarrage :&lt;br /&gt;
 # systemctl enable hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-dashboard.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-dashboard.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le Dashboard écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl http://IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4703</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4703"/>
		<updated>2026-08-29T11:02:26Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Activer le Dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On démarre le Dashboard sur l’interface réseau de Hermes :&lt;br /&gt;
 # hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
&lt;br /&gt;
Pour écouter sur toutes les interfaces :&lt;br /&gt;
 # hermes dashboard --host &amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
&lt;br /&gt;
Le port par défaut est :&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour vérifier qu’il écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son état :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4702</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4702"/>
		<updated>2026-08-29T10:59:29Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Activer le Dashboard ===&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
Avant de modifier la configuration, on génère le hash du mot de passe qui sera utilisé pour l’authentification :&lt;br /&gt;
&lt;br /&gt;
 # python3 -c &#039;import hashlib,secrets,base64; p=&amp;quot;MON_MOT_DE_PASSE&amp;quot;; s=secrets.token_bytes(16); d=hashlib.scrypt(p.encode(),salt=s,n=16384,r=8,p=1,dklen=32); print(f&amp;quot;scrypt$16384$8$1${base64.b64encode(s).decode()}${base64.b64encode(d).decode()}&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
La commande retourne une valeur de la forme :&lt;br /&gt;
 scrypt$16384$8$1$...&lt;br /&gt;
&lt;br /&gt;
On génère ensuite le secret utilisé pour signer les sessions du Dashboard :&lt;br /&gt;
&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
On édite alors le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;quot;&amp;lt;font color = blue&amp;gt;scrypt$16384$8$1$...&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;quot;&amp;lt;font color = blue&amp;gt;secret_généré_par_openssl&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On démarre le Dashboard sur l’interface réseau de Hermes :&lt;br /&gt;
 # hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
&lt;br /&gt;
Pour écouter sur toutes les interfaces :&lt;br /&gt;
 # hermes dashboard --host &amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
&lt;br /&gt;
Le port par défaut est :&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour vérifier qu’il écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son état :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4701</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4701"/>
		<updated>2026-08-29T10:58:40Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Activer le Dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4700</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4700"/>
		<updated>2026-08-29T10:57:10Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Activer le serveur API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
== Activer le Dashboard ==&lt;br /&gt;
Le Dashboard expose l’interface d’administration de Hermes ainsi que les API utilisées notamment pour les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_USERNAME=&amp;lt;font color = blue&amp;gt;admin&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=&amp;lt;font color = blue&amp;gt;scrypt$...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_DASHBOARD_BASIC_AUTH_SECRET=&amp;lt;font color = blue&amp;gt;clef_secrete_longue&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour générer le hash du mot de passe :&lt;br /&gt;
 # python -c &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;MON_MOT_DE_PASSE&#039;))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour générer le secret de signature :&lt;br /&gt;
 # openssl rand -hex 32&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte = Le Dashboard donne accès à des fonctions d’administration sensibles de Hermes. Dès qu’il écoute sur une interface réseau autre que &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;, Hermes impose une authentification. Utiliser un mot de passe fort et limiter également l’accès au port &amp;lt;code&amp;gt;9119&amp;lt;/code&amp;gt; via firewall ou réseau privé.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On démarre le Dashboard sur l’interface réseau de Hermes :&lt;br /&gt;
 # hermes dashboard --host &amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
&lt;br /&gt;
Pour écouter sur toutes les interfaces :&lt;br /&gt;
 # hermes dashboard --host &amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt; --no-open&lt;br /&gt;
&lt;br /&gt;
Le port par défaut est :&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour vérifier qu’il écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son état :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:9119/api/status&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4699</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4699"/>
		<updated>2026-08-29T10:07:17Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/hermes-workplace/docker-compose.yml --project-directory /opt/hermes-workplace up -d&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4698</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4698"/>
		<updated>2026-08-29T10:05:57Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4697</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4697"/>
		<updated>2026-08-29T10:03:25Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
 # mkdir -p /opt/hermes-workplace&lt;br /&gt;
 # vi /opt/hermes-workplace/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   hermes-workspace:&lt;br /&gt;
     image: ghcr.io/outsourc-e/hermes-workspace:latest&lt;br /&gt;
     container_name: hermes-workspace&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
     environment:&lt;br /&gt;
       #HERMES_HOME: /home/workspace/.hermes&lt;br /&gt;
       #HERMES_WORKSPACE_DIR: /workspace&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_URL: http:/&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
       HERMES_DASHBOARD_URL: http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
       HERMES_API_TOKEN: &amp;quot;&amp;quot;&lt;br /&gt;
       HERMES_PASSWORD: &amp;quot;&amp;lt;font color = blue&amp;gt;change-moi&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     volumes:&lt;br /&gt;
       - ./workspace:/workspace&lt;br /&gt;
 &lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;3000:3000&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4696</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4696"/>
		<updated>2026-08-29T09:53:02Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= Modules d’extension et d’intégration =&lt;br /&gt;
Ressource :&lt;br /&gt;
* [https://github.com/0xNyk/awesome-hermes-agent Awesome Hermes Agent] : liste de différentes extensions classé par catégorie.&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workplace] ==&lt;br /&gt;
Un espace de travail complet : orchestrez vos agents, parcourez la mémoire, gérez les compétences et contrôlez l’ensemble depuis une interface unique.&lt;br /&gt;
=== Docker ===&lt;br /&gt;
&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=4695</id>
		<title>Llama-swap</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=4695"/>
		<updated>2026-08-28T19:55:22Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Muse-Glimmer-30B-GGUF (2x 12 Go VRAM) Généraliste dense rapide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
=== Debian ===&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y nodejs npm golang-go&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/mostlygeek/llama-swap.git&lt;br /&gt;
 # cd llama-swap&lt;br /&gt;
 # make clean all&lt;br /&gt;
* On crée le service SystemD :&lt;br /&gt;
 # vi /etc/systemd/system/llama-swap.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-swap&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 ExecStart=/opt/llama-swap/build/llama-swap-linux-amd64 --config /etc/llama-swap/config.yaml --listen &amp;lt;font color=blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;:&amp;lt;font color=blue&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 systemctl enable --now llama-swap&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
* Si nécessaire, on crée le dossier :&lt;br /&gt;
  # mkdir /etc/llama-swap&lt;br /&gt;
* On édite le fichier de configuration :&lt;br /&gt;
 # vi /etc/llama-swap/config.yaml&lt;br /&gt;
* Exemple de configuration de base :&lt;br /&gt;
 &lt;br /&gt;
 apiKeys:&lt;br /&gt;
   - &amp;quot;CLE_API_1&amp;quot;&lt;br /&gt;
   - &amp;quot;CLE_API_2&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 logLevel: info&lt;br /&gt;
 &lt;br /&gt;
 healthCheckTimeout: 500&lt;br /&gt;
 &lt;br /&gt;
 globalTTL: 0&lt;br /&gt;
 &lt;br /&gt;
 unloadTimeout: 10&lt;br /&gt;
 &lt;br /&gt;
 logToStdout: both&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Les options globales se placent au début du fichier, avant la section &amp;lt;code&amp;gt;models:&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
=== Groupes de modèles ===&lt;br /&gt;
&lt;br /&gt;
Llama-swap peut gérer plusieurs modèles derrière une seule instance et un seul port d&#039;accès.&lt;br /&gt;
&lt;br /&gt;
Les modèles restent définis normalement sous la section :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
models:&lt;br /&gt;
  &amp;quot;Gemma4-31B&amp;quot;:&lt;br /&gt;
    name: &amp;quot;Gemma4-31B&amp;quot;&lt;br /&gt;
    cmd: |&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Gemma4-26B&amp;quot;:&lt;br /&gt;
    name: &amp;quot;Gemma4-26B&amp;quot;&lt;br /&gt;
    cmd: |&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Aux&amp;quot;:&lt;br /&gt;
    name: &amp;quot;Petit modèle auxiliaire&amp;quot;&lt;br /&gt;
    cmd: |&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La partie de routage est séparée de la définition des modèles.&lt;br /&gt;
&lt;br /&gt;
Les clients continuent à utiliser la même URL, par exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://serveur.example/v1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle demandé est sélectionné avec le champ :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;model&amp;quot;: &amp;quot;Gemma4-31B&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Llama-swap démarre alors le backend correspondant et lui attribue un port interne via &amp;lt;code&amp;gt;${PORT}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Plusieurs modèles peuvent être actifs simultanément si la configuration de routage l&#039;autorise.&lt;br /&gt;
&lt;br /&gt;
==== Groupes ====&lt;br /&gt;
&lt;br /&gt;
Le mode &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; permet de répartir les modèles dans plusieurs groupes.&lt;br /&gt;
&lt;br /&gt;
Par exemple, un groupe contenant les gros modèles principaux :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
routing:&lt;br /&gt;
  router:&lt;br /&gt;
    use: group&lt;br /&gt;
    settings:&lt;br /&gt;
      groups:&lt;br /&gt;
        main:&lt;br /&gt;
          swap: true&lt;br /&gt;
          exclusive: false&lt;br /&gt;
          members:&lt;br /&gt;
            - Gemma4-31B&lt;br /&gt;
            - Gemma4-26B&lt;br /&gt;
            - Qwen3.8-27B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
swap: true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
un seul modèle de ce groupe est conservé à la fois.&lt;br /&gt;
&lt;br /&gt;
Ainsi, si &amp;lt;code&amp;gt;Gemma4-31B&amp;lt;/code&amp;gt; est chargé et qu&#039;une requête demande &amp;lt;code&amp;gt;Gemma4-26B&amp;lt;/code&amp;gt;, llama-swap peut décharger le premier puis charger le second.&lt;br /&gt;
&lt;br /&gt;
Il est possible de créer un second groupe pour les modèles auxiliaires :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
routing:&lt;br /&gt;
  router:&lt;br /&gt;
    use: group&lt;br /&gt;
    settings:&lt;br /&gt;
      groups:&lt;br /&gt;
        main:&lt;br /&gt;
          swap: true&lt;br /&gt;
          exclusive: false&lt;br /&gt;
          members:&lt;br /&gt;
            - Gemma4-31B&lt;br /&gt;
            - Gemma4-26B&lt;br /&gt;
&lt;br /&gt;
        auxiliary:&lt;br /&gt;
          swap: true&lt;br /&gt;
          exclusive: false&lt;br /&gt;
          members:&lt;br /&gt;
            - Qwen3-1.7B&lt;br /&gt;
            - Qwen3-4B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On obtient alors deux groupes indépendants :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Groupe principal :&lt;br /&gt;
  Gemma4-31B&lt;br /&gt;
  OU&lt;br /&gt;
  Gemma4-26B&lt;br /&gt;
&lt;br /&gt;
Groupe auxiliaire :&lt;br /&gt;
  Qwen3-1.7B&lt;br /&gt;
  OU&lt;br /&gt;
  Qwen3-4B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si les groupes ne sont pas exclusifs entre eux, une combinaison telle que :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gemma4-31B + Qwen3-1.7B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
peut rester chargée simultanément.&lt;br /&gt;
&lt;br /&gt;
Cela est utile pour un agent utilisant :&lt;br /&gt;
&lt;br /&gt;
* un gros modèle principal ;&lt;br /&gt;
* un petit modèle pour la génération de titres ;&lt;br /&gt;
* un petit modèle pour certaines tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
État initial :&lt;br /&gt;
Gemma4-31B + Qwen3-1.7B&lt;br /&gt;
&lt;br /&gt;
Nouvelle requête :&lt;br /&gt;
Gemma4-26B&lt;br /&gt;
&lt;br /&gt;
Résultat :&lt;br /&gt;
Gemma4-31B est déchargé&lt;br /&gt;
Gemma4-26B est chargé&lt;br /&gt;
Qwen3-1.7B reste chargé&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode groupes est adapté lorsque l&#039;organisation souhaitée peut être représentée simplement sous forme de plusieurs ensembles indépendants.&lt;br /&gt;
&lt;br /&gt;
==== Matrix ====&lt;br /&gt;
&lt;br /&gt;
Le mode &amp;lt;code&amp;gt;matrix&amp;lt;/code&amp;gt; permet un contrôle plus précis des combinaisons de modèles autorisées.&lt;br /&gt;
&lt;br /&gt;
Contrairement aux groupes, on ne décrit plus seulement des familles de modèles : on décrit directement quelles combinaisons peuvent coexister.&lt;br /&gt;
&lt;br /&gt;
Le routeur est activé avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
routing:&lt;br /&gt;
  router:&lt;br /&gt;
    use: matrix&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une matrice peut par exemple autoriser :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gemma4-31B + Aux&lt;br /&gt;
OU&lt;br /&gt;
Gemma4-26B + Aux&lt;br /&gt;
OU&lt;br /&gt;
Vision + Aux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tout en interdisant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gemma4-31B + Gemma4-26B&lt;br /&gt;
Gemma4-31B + Vision&lt;br /&gt;
Gemma4-26B + Vision&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
routing:&lt;br /&gt;
  router:&lt;br /&gt;
    use: matrix&lt;br /&gt;
    settings:&lt;br /&gt;
      matrix:&lt;br /&gt;
        vars:&lt;br /&gt;
          g31: Gemma4-31B&lt;br /&gt;
          g26: Gemma4-26B&lt;br /&gt;
          aux: Qwen3-1.7B&lt;br /&gt;
          vis: Qwen3-VL-4B&lt;br /&gt;
&lt;br /&gt;
        sets:&lt;br /&gt;
          main31: &amp;quot;g31 &amp;amp; aux&amp;quot;&lt;br /&gt;
          main26: &amp;quot;g26 &amp;amp; aux&amp;quot;&lt;br /&gt;
          vision: &amp;quot;vis &amp;amp; aux&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les variables permettent d&#039;utiliser des noms courts dans les expressions :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vars:&lt;br /&gt;
  g31: Gemma4-31B&lt;br /&gt;
  aux: Qwen3-1.7B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis les combinaisons sont décrites dans &amp;lt;code&amp;gt;sets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sets:&lt;br /&gt;
  main31: &amp;quot;g31 &amp;amp; aux&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le symbole &amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt; indique que les deux modèles peuvent faire partie de la même combinaison autorisée.&lt;br /&gt;
&lt;br /&gt;
Le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; permet d&#039;exprimer une alternative.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sets:&lt;br /&gt;
  normal: &amp;quot;(g31 | g26) &amp;amp; aux&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cela représente :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gemma4-31B OU Gemma4-26B&lt;br /&gt;
+&lt;br /&gt;
Aux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire peut donc rester chargé pendant que llama-swap remplace le modèle principal.&lt;br /&gt;
&lt;br /&gt;
===== Coût d&#039;éviction =====&lt;br /&gt;
&lt;br /&gt;
Matrix permet également d&#039;attribuer un coût à l&#039;éviction d&#039;un modèle.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
evict_costs:&lt;br /&gt;
  g31: 20&lt;br /&gt;
  g26: 20&lt;br /&gt;
  aux: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un modèle long à charger peut recevoir un coût élevé.&lt;br /&gt;
&lt;br /&gt;
Un petit modèle rapide à recharger peut recevoir un coût faible.&lt;br /&gt;
&lt;br /&gt;
Lorsque plusieurs solutions sont possibles, llama-swap peut ainsi privilégier celle qui évite de décharger les modèles les plus coûteux.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gemma4-31B : coûteux à recharger&lt;br /&gt;
Aux         : rapide à recharger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut donc attribuer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
evict_costs:&lt;br /&gt;
  g31: 20&lt;br /&gt;
  aux: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Exemple pratique =====&lt;br /&gt;
&lt;br /&gt;
Supposons les modèles suivants :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
models:&lt;br /&gt;
  &amp;quot;Gemma4-31B&amp;quot;:&lt;br /&gt;
    cmd: |&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Gemma4-26B&amp;quot;:&lt;br /&gt;
    cmd: |&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;Aux&amp;quot;:&lt;br /&gt;
    cmd: |&lt;br /&gt;
      ...&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;CrispASR&amp;quot;:&lt;br /&gt;
    cmd: |&lt;br /&gt;
      ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On souhaite :&lt;br /&gt;
&lt;br /&gt;
* permettre un gros LLM avec le modèle auxiliaire ;&lt;br /&gt;
* remplacer librement le gros LLM ;&lt;br /&gt;
* ne pas charger deux gros LLM simultanément ;&lt;br /&gt;
* empêcher CrispASR de fonctionner en même temps qu&#039;un gros modèle si la VRAM est insuffisante.&lt;br /&gt;
&lt;br /&gt;
Conceptuellement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Autorisé :&lt;br /&gt;
&lt;br /&gt;
Gemma4-31B + Aux&lt;br /&gt;
Gemma4-26B + Aux&lt;br /&gt;
CrispASR + Aux&lt;br /&gt;
&lt;br /&gt;
Interdit :&lt;br /&gt;
&lt;br /&gt;
Gemma4-31B + Gemma4-26B&lt;br /&gt;
Gemma4-31B + CrispASR&lt;br /&gt;
Gemma4-26B + CrispASR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, Matrix est généralement plus adapté que de simples groupes.&lt;br /&gt;
&lt;br /&gt;
===== Groupes ou Matrix ? =====&lt;br /&gt;
&lt;br /&gt;
Le mode &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; est généralement suffisant lorsque les modèles peuvent être organisés simplement en plusieurs familles indépendantes.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 gros LLM parmi plusieurs&lt;br /&gt;
+&lt;br /&gt;
1 petit modèle auxiliaire parmi plusieurs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode &amp;lt;code&amp;gt;matrix&amp;lt;/code&amp;gt; est préférable lorsque les règles deviennent plus complexes.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Gemma31 peut coexister avec Aux&lt;br /&gt;
Gemma26 peut coexister avec Aux&lt;br /&gt;
CrispASR peut coexister avec Aux&lt;br /&gt;
mais aucun gros modèle ne peut coexister avec CrispASR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Matrix permet alors d&#039;exprimer directement les contraintes de RAM, de VRAM et d&#039;utilisation des GPU.&lt;br /&gt;
&lt;br /&gt;
Il n&#039;est pas nécessaire de lancer plusieurs instances de llama-swap : une seule instance peut gérer plusieurs modèles actifs simultanément, tous accessibles via le même port externe.&lt;br /&gt;
&lt;br /&gt;
== Exemples de modèles ==&lt;br /&gt;
==== [[Beellama.cpp#Qwen3.8-27B_Context_144384_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 144384 Kvarn6/Kvarn6 (2x 12 Go de VRAM)]] Spécialiste codeur lent ====&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 models:&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;Qwen3.8-27B&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Qwen3.8-27B&amp;quot;&lt;br /&gt;
     capabilities:&lt;br /&gt;
       in:&lt;br /&gt;
         - text&lt;br /&gt;
         - image&lt;br /&gt;
       out:&lt;br /&gt;
         - text&lt;br /&gt;
       tools: true&lt;br /&gt;
       context: 144384&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /opt/beellama.cpp/build/bin/llama-server&lt;br /&gt;
       -m /opt/models/Qwen3.8-27B/UD-Q4_K_XL/Qwen3.8-27B-UD-Q4_K_XL.gguf&lt;br /&gt;
       --mmproj /opt/models/Qwen3.8-27B/UD-Q4_K_XL/mmproj-BF16.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
       --image-min-tokens 1024&lt;br /&gt;
       -ngl 999&lt;br /&gt;
       -sm tensor&lt;br /&gt;
       -ts 1/1&lt;br /&gt;
       -t 4&lt;br /&gt;
       -tb 4&lt;br /&gt;
       -b 1024&lt;br /&gt;
       -ub 1024&lt;br /&gt;
       -c 144384&lt;br /&gt;
       -np 1&lt;br /&gt;
       -fa on&lt;br /&gt;
       --load-mode none&lt;br /&gt;
       -ctk kvarn6&lt;br /&gt;
       -ctv kvarn6&lt;br /&gt;
       --kv-tail-tokens 1024&lt;br /&gt;
       --spec-type ngram-mod,draft-mtp&lt;br /&gt;
       --spec-ngram-mod-n-match 24&lt;br /&gt;
       --spec-ngram-mod-n-min 12&lt;br /&gt;
       --spec-ngram-mod-n-max 48&lt;br /&gt;
       --spec-draft-n-max 3&lt;br /&gt;
       --spec-draft-n-min 0&lt;br /&gt;
       --spec-draft-p-min 0.75&lt;br /&gt;
       --reasoning on&lt;br /&gt;
       --reasoning-preserve&lt;br /&gt;
       --jinja&lt;br /&gt;
       --chat-template-file /opt/models/Qwen-Fixed-Chat-Templates/chat_template.jinja&lt;br /&gt;
       --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039;&lt;br /&gt;
       --reasoning-format deepseek&lt;br /&gt;
       --reasoning-budget 16192&lt;br /&gt;
       --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot;&lt;br /&gt;
       --slot-save-path /kv_cache/&lt;br /&gt;
       --temp 1.0&lt;br /&gt;
       --top-k 20&lt;br /&gt;
       --top-p 0.95&lt;br /&gt;
       --min-p 0.0&lt;br /&gt;
       --presence-penalty 0.0&lt;br /&gt;
       --repeat-penalty 1.0&lt;br /&gt;
       --host 127.0.0.1&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
&lt;br /&gt;
==== [[Llama.cpp#gemma-4-31B-it-qat_pour_test_traduction_intelligente_(2x_12_Go_de_VRAM)|gemma-4-31B-it-qat-GGUF Context 32768 pour traduction (2x 12 Go de VRAM)]] Spécialiste traduction ====&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 models:&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;traducteur&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Gemma4-31B-QAT&amp;quot;&lt;br /&gt;
     capabilities:&lt;br /&gt;
       in:&lt;br /&gt;
         - text&lt;br /&gt;
       out:&lt;br /&gt;
         - text&lt;br /&gt;
       tools: true&lt;br /&gt;
       context: 32768&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       env LLAMA_GRAPH_REUSE_DISABLE=1 /opt/llama.cpp/build/bin/llama-server&lt;br /&gt;
       -m /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL/gemma-4-31B-it-qat-UD-Q4_K_XL.gguf&lt;br /&gt;
       --host 127.0.0.1&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
       -ngl 999&lt;br /&gt;
       -sm tensor&lt;br /&gt;
       --tensor-split 1,1&lt;br /&gt;
       -c 32768&lt;br /&gt;
       -ctk q8_0&lt;br /&gt;
       -ctv q8_0&lt;br /&gt;
       -np 1&lt;br /&gt;
       -b 1024&lt;br /&gt;
       -ub 1024&lt;br /&gt;
       -fa on&lt;br /&gt;
       --jinja&lt;br /&gt;
       --reasoning off&lt;br /&gt;
       --spec-type ngram-mod,draft-mtp&lt;br /&gt;
       --spec-ngram-mod-n-match 24&lt;br /&gt;
       --spec-ngram-mod-n-min 12&lt;br /&gt;
       --spec-ngram-mod-n-max 48&lt;br /&gt;
       --spec-draft-model /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-31B-it-Q8_0.gguf&lt;br /&gt;
       --spec-draft-n-max 4&lt;br /&gt;
       --spec-draft-n-min 0&lt;br /&gt;
       --spec-draft-p-min 0.75&lt;br /&gt;
       --slot-save-path /kv_cache/&lt;br /&gt;
       --temp 1.0&lt;br /&gt;
       --top-p 0.95&lt;br /&gt;
       --top-k 64&lt;br /&gt;
       --min-p 0.0&lt;br /&gt;
       --presence-penalty 0.0&lt;br /&gt;
       --repeat-penalty 1.0&lt;br /&gt;
&lt;br /&gt;
==== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat-GGUF] (2x 12 Go VRAM) Généraliste rapide ====&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;*mtp*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-BF16*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 models:&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;Gemma4-26B&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Gemma4-26B-A4B-QAT&amp;quot;&lt;br /&gt;
     capabilities:&lt;br /&gt;
       in:&lt;br /&gt;
         - text&lt;br /&gt;
         - image&lt;br /&gt;
       out:&lt;br /&gt;
         - text&lt;br /&gt;
       tools: true&lt;br /&gt;
       context: 212992&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       env LLAMA_GRAPH_REUSE_DISABLE=1 /opt/llama.cpp/build/bin/llama-server&lt;br /&gt;
       -m /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL/gemma-4-26B-A4B-it-qat-UD-Q4_K_XL.gguf&lt;br /&gt;
       --host 127.0.0.1&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
       -ngl 999&lt;br /&gt;
       -sm tensor&lt;br /&gt;
       --tensor-split 1,1&lt;br /&gt;
       -c 212992&lt;br /&gt;
       -ctk q8_0&lt;br /&gt;
       -ctv q8_0&lt;br /&gt;
       -np 1&lt;br /&gt;
       -b 1024&lt;br /&gt;
       -ub 1024&lt;br /&gt;
       -fa on&lt;br /&gt;
       --jinja&lt;br /&gt;
       --reasoning on&lt;br /&gt;
       --slot-save-path /kv_cache/&lt;br /&gt;
       --temp 1.0&lt;br /&gt;
       --top-p 0.95&lt;br /&gt;
       --top-k 64&lt;br /&gt;
       --min-p 0.0&lt;br /&gt;
       --presence-penalty 0.0&lt;br /&gt;
       --repeat-penalty 1.0&lt;br /&gt;
       --spec-type ngram-mod,draft-mtp&lt;br /&gt;
       --spec-draft-model /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q8_0.gguf&lt;br /&gt;
       --spec-draft-n-max 4&lt;br /&gt;
       --spec-draft-n-min 0&lt;br /&gt;
       --spec-draft-p-min 0.75&lt;br /&gt;
       --spec-ngram-mod-n-match 24&lt;br /&gt;
       --spec-ngram-mod-n-min 12&lt;br /&gt;
       --spec-ngram-mod-n-max 48&lt;br /&gt;
       --mmproj /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL/mmproj-BF16.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
==== [https://huggingface.co/unsloth/gemma-4-31B-it-GGUF gemma-4-31B-it-GGUF] (2x 12 Go VRAM) UD-IQ3_XXS Généraliste dense ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
L&#039;utilisation d&#039;une quantification en dessous de 4 bits (et d&#039;un KV cache quantifié sur un Gemma-4 non-QAT) est déconseillée. Usage expérimental uniquement.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-GGUF --include &amp;quot;*UD-IQ3_XXS*.gguf&amp;quot; --include &amp;quot;*mtp-gemma-4-31B-it-Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-BF16*.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-GGUF/UD-IQ3_XXS&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 models:&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;Gemma4-31B&amp;quot;:&lt;br /&gt;
     name: &amp;quot;gemma-4-31B-it&amp;quot;&lt;br /&gt;
     capabilities:&lt;br /&gt;
       in:&lt;br /&gt;
         - text&lt;br /&gt;
         - image&lt;br /&gt;
       out:&lt;br /&gt;
         - text&lt;br /&gt;
       tools: true&lt;br /&gt;
       context: 110592&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       env LLAMA_GRAPH_REUSE_DISABLE=1 /opt/llama.cpp/build/bin/llama-server&lt;br /&gt;
       -m /opt/models/gemma-4-31B-it-GGUF/UD-IQ3_XXS/gemma-4-31B-it-UD-IQ3_XXS.gguf&lt;br /&gt;
       --host 127.0.0.1&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
       -ngl 999&lt;br /&gt;
       -sm tensor&lt;br /&gt;
       --tensor-split 1,1&lt;br /&gt;
       -c 110592&lt;br /&gt;
       -ctk q8_0&lt;br /&gt;
       -ctv q8_0&lt;br /&gt;
       -np 1&lt;br /&gt;
       -b 1024&lt;br /&gt;
       -ub 1024&lt;br /&gt;
       -fa on&lt;br /&gt;
       --jinja&lt;br /&gt;
       --reasoning on&lt;br /&gt;
       --slot-save-path /kv_cache/&lt;br /&gt;
       --temp 1.0&lt;br /&gt;
       --top-p 0.95&lt;br /&gt;
       --top-k 64&lt;br /&gt;
       --min-p 0.0&lt;br /&gt;
       --presence-penalty 0.0&lt;br /&gt;
       --repeat-penalty 1.0&lt;br /&gt;
       --spec-type ngram-mod,draft-mtp&lt;br /&gt;
       --spec-draft-model /opt/models/gemma-4-31B-it-GGUF/UD-IQ3_XXS/MTP/mtp-gemma-4-31B-it-Q8_0.gguf&lt;br /&gt;
       --spec-draft-n-max 4&lt;br /&gt;
       --spec-draft-n-min 0&lt;br /&gt;
       --spec-draft-p-min 0.75&lt;br /&gt;
       --spec-ngram-mod-n-match 24&lt;br /&gt;
       --spec-ngram-mod-n-min 12&lt;br /&gt;
       --spec-ngram-mod-n-max 48&lt;br /&gt;
       --mmproj /opt/models/gemma-4-31B-it-GGUF/UD-IQ3_XXS/mmproj-BF16.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
==== [https://huggingface.co/bartowski/Ling-3.0-tiny-GGUF Ling-3.0-tiny-GGUF] (2x 12 Go VRAM) Petit model MOE ====&lt;br /&gt;
 # hf download bartowski/Ling-3.0-tiny-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/Ling-3.0-tiny-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 models:&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;Ling3-tiny&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Ling-3.0-tiny&amp;quot;&lt;br /&gt;
     capabilities:&lt;br /&gt;
       in:&lt;br /&gt;
         - text&lt;br /&gt;
       out:&lt;br /&gt;
         - text&lt;br /&gt;
       tools: true&lt;br /&gt;
       context: 262144&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /opt/llama.cpp/build/bin/llama-server&lt;br /&gt;
       -m /opt/models/Ling-3.0-tiny-GGUF/Q6_K_L/Ling-3.0-tiny-Q6_K_L.gguf&lt;br /&gt;
       --host 127.0.0.1&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
       -ngl 999&lt;br /&gt;
       -sm layer&lt;br /&gt;
       --tensor-split 1,1&lt;br /&gt;
       -c 262144&lt;br /&gt;
       -ctk q8_0&lt;br /&gt;
       -ctv q8_0&lt;br /&gt;
       -np 1&lt;br /&gt;
       -b 1024&lt;br /&gt;
       -ub 1024&lt;br /&gt;
       -fa on&lt;br /&gt;
       --jinja&lt;br /&gt;
       --slot-save-path /kv_cache/&lt;br /&gt;
       --temp 1.0&lt;br /&gt;
       --top-p 0.95&lt;br /&gt;
       --top-k 20&lt;br /&gt;
       --min-p 0.0&lt;br /&gt;
       --presence-penalty 0.0&lt;br /&gt;
       --repeat-penalty 1.0&lt;br /&gt;
==== [https://huggingface.co/unsloth/Muse-Glimmer-30B-GGUF Muse-Glimmer-30B-GGUF] (2x 12 Go VRAM) Généraliste dense rapide ====&lt;br /&gt;
 # hf download unsloth/Muse-Glimmer-30B-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;*mmproj-Muse-Glimmer-30B-Q8_0*.gguf&amp;quot; --include &amp;quot;*dflash-kquant*.gguf&amp;quot; --local-dir /opt/models/Muse-Glimmer-30B-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 models:&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;Muse-Glimmer&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Muse-Glimmer-30B&amp;quot;&lt;br /&gt;
     capabilities:&lt;br /&gt;
       in:&lt;br /&gt;
         - text&lt;br /&gt;
         - image&lt;br /&gt;
       out:&lt;br /&gt;
         - text&lt;br /&gt;
       tools: true&lt;br /&gt;
       context: 131072&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /opt/llama.cpp/build/bin/llama-server&lt;br /&gt;
       -m /opt/models/Muse-Glimmer-30B-GGUF/UD-Q4_K_XL/Muse-Glimmer-30B-UD-Q4_K_XL.gguf&lt;br /&gt;
       --spec-type draft-dflash,ngram-mod&lt;br /&gt;
       --spec-draft-model /opt/models/Muse-Glimmer-30B-GGUF/UD-Q4_K_XL/dflash-kquant.gguf&lt;br /&gt;
       --spec-draft-ngl all &lt;br /&gt;
       --spec-draft-n-max 15&lt;br /&gt;
       --override-kv muse-glimmer.context_length=int:131072,dflash.context_length=int:131072&lt;br /&gt;
       --spec-ngram-mod-n-match 24&lt;br /&gt;
       --spec-ngram-mod-n-min 12&lt;br /&gt;
       --spec-ngram-mod-n-max 48&lt;br /&gt;
       --host 127.0.0.1&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
       -ngl 999&lt;br /&gt;
       -sm layer&lt;br /&gt;
       --tensor-split 1,1&lt;br /&gt;
       -c 131072&lt;br /&gt;
       -ctk q8_0&lt;br /&gt;
       -ctv q8_0&lt;br /&gt;
       -np 1&lt;br /&gt;
       -b 2048&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -fa on&lt;br /&gt;
       --jinja&lt;br /&gt;
       --slot-save-path /kv_cache/&lt;br /&gt;
       --temp 1.0&lt;br /&gt;
       --top-p 0.95&lt;br /&gt;
       --top-k 64&lt;br /&gt;
       --min-p 0.0&lt;br /&gt;
       --presence-penalty 0.0&lt;br /&gt;
       --repeat-penalty 1.0&lt;br /&gt;
       --mmproj /opt/models/Muse-Glimmer-30B-GGUF/UD-Q4_K_XL/mmproj-Muse-Glimmer-30B-Q8_0.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4694</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4694"/>
		<updated>2026-08-28T19:19:44Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Firecrawl */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Scraping via Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
On renseigne l&#039;adresse de l&#039;instance Firecrawl :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_URL=http://&amp;lt;font color = blue&amp;gt;IP_DE_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Si besoin configurer l&#039;API key :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 FIRECRAWL_API_KEY=&amp;lt;font color = blue&amp;gt;c-xxxxxxxxxxxxxxxx&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite on édite la configuration de Hermes :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On remplace :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: &#039;&#039;&lt;br /&gt;
   extract_backend: &#039;&#039;&lt;br /&gt;
Par :&lt;br /&gt;
 web:&lt;br /&gt;
   backend: searxng&lt;br /&gt;
   search_backend: searxng&lt;br /&gt;
   extract_backend: firecrawl&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4693</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4693"/>
		<updated>2026-08-28T18:50:02Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Firecrawl */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Firecrawl ===&lt;br /&gt;
Il faut d’abord avoir [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Firecrawl&amp;diff=4692</id>
		<title>Firecrawl</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Firecrawl&amp;diff=4692"/>
		<updated>2026-08-28T18:47:19Z</updated>

		<summary type="html">&lt;p&gt;Admin : Page créée avec « == Docker ==   # cd /opt  On clone le dépôt :   # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/firecrawl/firecrawl.git  # cd firecrawl  Firecrawl fournit directement un fichier &amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt; prêt à l&amp;#039;emploi.  Par défaut : * l&amp;#039;authentification de la base est désactivée ; * l&amp;#039;API Firecrawl écoute sur le port &amp;lt;code&amp;gt;3002&amp;lt;/code&amp;gt; ; * les différents services nécessaires sont démarrés automatiquement.  On construit et démarre les conteneu... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Docker ==&lt;br /&gt;
&lt;br /&gt;
 # cd /opt&lt;br /&gt;
&lt;br /&gt;
On clone le dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/firecrawl/firecrawl.git&lt;br /&gt;
 # cd firecrawl&lt;br /&gt;
&lt;br /&gt;
Firecrawl fournit directement un fichier &amp;lt;code&amp;gt;docker-compose.yaml&amp;lt;/code&amp;gt; prêt à l&#039;emploi.&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
* l&#039;authentification de la base est désactivée ;&lt;br /&gt;
* l&#039;API Firecrawl écoute sur le port &amp;lt;code&amp;gt;3002&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* les différents services nécessaires sont démarrés automatiquement.&lt;br /&gt;
&lt;br /&gt;
On construit et démarre les conteneurs :&lt;br /&gt;
&lt;br /&gt;
 # docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
On vérifie leur état :&lt;br /&gt;
&lt;br /&gt;
 # docker compose ps&lt;br /&gt;
&lt;br /&gt;
L&#039;API est alors disponible à l&#039;adresse :&lt;br /&gt;
&lt;br /&gt;
 http://&amp;lt;font color=blue&amp;gt;IP_FIRECRAWL&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3002&amp;lt;/font&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Accueil&amp;diff=4691</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Accueil&amp;diff=4691"/>
		<updated>2026-08-28T18:37:02Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-bandeau&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Baneau wiki 2.png|frameless|1000px|link=|alt=Le Wiki de Lug — Une pieuvre, huit bras, trop de projets.]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tiles&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-large accueil-tile-ia&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile ia.webp|link=page_IA|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Page dédiée à l&#039;IA&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;LLM locaux, agents, outils et tests.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-large accueil-tile-linux&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile linux.webp|link=page_Linux|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Linux&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Commandes, optimisations, scripts et réglages en vrac.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-large accueil-tile-proxmox&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile proxmox.webp|link=page_ProxMox|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;ProxMox&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;VM, LXC, stockage, réseau et sauvegardes.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-mediawiki&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile mediawiki.webp|link=MediaWiki|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;MediaWiki&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Moteur de wiki libre pour organiser la documentation.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-jellyfin&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile jellyfin.webp|link=MediaWiki|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Jellyfin&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Serveur libre pour organiser et diffuser ses médias.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-nextcloud&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile nextcloud.webp|link=Nextcloud|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Nextcloud&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Cloud personnel libre pour fichiers, contacts et calendriers.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-docker&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile docker.webp|link=page_Docker|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Docker&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Plateforme de conteneurs pour déployer et isoler des services.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-wireguard&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile wireguard.webp|link=WireGuard_LXC_Alpine_Linux|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;WireGuard&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;VPN léger et rapide pour connexions sécurisées.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-prometheus&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile prometheus.webp|link=Prometheus|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Prometheus&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Supervision, métriques, alertes et tableaux de bord.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-syncthing&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile syncthing.webp|link=Syncthing|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Syncthing&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Synchronisation de fichiers libre entre plusieurs appareils.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-rustdesk&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile rustdesk.webp|link=RustDesk|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;RustDesk&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Bureau à distance libre et sécurisé.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-reverseproxy&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile reverseproxy.webp|link=Nginx_ReverseProxy_LXC_Alpine_Linux|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Proxy inverse Nginx&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;HTTPS, redirections et accès sécurisé aux services.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-caddy&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile caddy.webp|link=caddy_ReverseProxy|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Proxy inverse Caddy&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;HTTPS automatique, configuration simple et accès sécurisé aux services.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-ca&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile ca.webp|link=Serveur_CA_LXC_Alpine_Linux|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Serveur CA&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Gestion des certificats, signatures et confiance interne.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-searxng&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile searxng.webp|link=SearXNG|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;SearXNG&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Recherche web privée et auto-hébergée.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-camofox&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile camofox.webp|link=Camofox|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Camofox&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Un navigateur anti-détection open source conçu pour les agents d’IA.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-firecrawl&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile firecrawl.webp|link=Firecrawl|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Firecrawl&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Extraction web open source pour agents d’IA.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-moonlightweb&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile moonlightweb.webp|link=moonlight_web_stream|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Moonlight Web&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Accès web au streaming Moonlight depuis vos appareils.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-truenas&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile truenas.webp|link=page_TrueNAS|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;TrueNAS&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Stockage NAS, ZFS, partages et optimisations.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-suitecrm&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile suitecrm.webp|link=SuiteCRM|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;SuiteCRM&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;CRM libre pour gestion client et suivi commercial.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-prestashop&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile prestashop.webp|link=PrestaShop|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;PrestaShop&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Solution e-commerce pour gérer une boutique en ligne.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-zoneminder&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile zoneminder.webp|link=ZoneMinder|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;ZoneMinder&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Solution NVR libre et historique pour caméras IP.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-wsl&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile wsl.webp|link=Windows_WSL|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;WSL&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Environnement Linux intégré à Windows.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-large accueil-tile-retrogaming&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile retrogaming.webp|link=page_RetroGaming|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;RetroGaming&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Jeux rétro, ROMs, streaming et organisation de ludothèque.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Fichier:Tuile_firecrawl.webp&amp;diff=4690</id>
		<title>Fichier:Tuile firecrawl.webp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Fichier:Tuile_firecrawl.webp&amp;diff=4690"/>
		<updated>2026-08-28T18:33:48Z</updated>

		<summary type="html">&lt;p&gt;Admin : Tuile Firecrawl..&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Tuile Firecrawl..&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4689</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4689"/>
		<updated>2026-08-28T18:30:44Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Installation native */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Firecrawl ===&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4688</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4688"/>
		<updated>2026-08-28T18:30:31Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Installation native */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Firecrawl ===&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Méthode recommandé mais déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4687</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4687"/>
		<updated>2026-08-28T18:29:54Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Installation native */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Firecrawl ===&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afin de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4686</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4686"/>
		<updated>2026-08-28T18:29:02Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* SearXNG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
=== Firecrawl ===&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4685</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4685"/>
		<updated>2026-08-28T17:32:21Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP-CamoFox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ===&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4684</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4684"/>
		<updated>2026-08-28T17:31:58Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP pour remplacer les outils web natifs de Hermes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4683</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4683"/>
		<updated>2026-08-28T17:31:50Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP pour remplacer les outils web natifs de Hermes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = danger&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Expérimental et non recommandé. Après de nombreux essais, l&#039;utilisation de serveurs MCP pour remplacer des outils natifs destinés à des tâches basiques, comme la recherche web, complexifie fortement l&#039;architecture de Hermes au quotidien.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4682</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4682"/>
		<updated>2026-08-28T17:26:02Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Désactiver Tool Search */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4681</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4681"/>
		<updated>2026-08-28T17:25:50Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== MCP pour remplacer les outils web natifs de Hermes ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Utiliser des serveurs MCP pour remplacer les outils web natifs de Hermes augmente fortement le nombre d&#039;outils disponibles, ce qui peut rendre leur gestion plus complexe pour les LLM.&lt;br /&gt;
}}&lt;br /&gt;
=== Désactiver Tool Search ===&lt;br /&gt;
Hermes utilise &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; pour éviter d&#039;envoyer au modèle la description complète de tous les outils disponibles à chaque requête.&lt;br /&gt;
&lt;br /&gt;
Lorsque &amp;lt;code&amp;gt;Tool Search&amp;lt;/code&amp;gt; est activé, Hermes conserve directement dans le contexte les outils principaux, tandis qu&#039;une partie des outils supplémentaires — notamment ceux provenant des serveurs MCP et de certains plugins — est placée dans une liste d&#039;outils différés.&lt;br /&gt;
&lt;br /&gt;
Le modèle doit alors retrouver l&#039;outil dont il a besoin à l&#039;aide de mécanismes comme :&lt;br /&gt;
&lt;br /&gt;
 tool_search&lt;br /&gt;
 tool_describe&lt;br /&gt;
 tool_call&lt;br /&gt;
&lt;br /&gt;
Cela permet de réduire la taille du prompt lorsque des dizaines ou des centaines d&#039;outils sont disponibles.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Lorsque les outils web natifs de Hermes sont remplacés par des serveurs MCP, les outils de recherche web et de navigation peuvent eux-mêmes devenir des outils différés. Le modèle doit alors commencer par les rechercher ou en demander la description avant de pouvoir les utiliser.&lt;br /&gt;
}&lt;br /&gt;
-----&lt;br /&gt;
Dans :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier :&lt;br /&gt;
&lt;br /&gt;
 tools:&lt;br /&gt;
   tool_search:&lt;br /&gt;
     enabled: off&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4680</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4680"/>
		<updated>2026-08-28T12:40:48Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP-CamoFox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;br /&gt;
=== Désactiver les outils web natifs de Hermes ===&lt;br /&gt;
Afin d&#039;être sûr qu&#039;Hermes n&#039;expose plus ses outils web natifs aux modèles, il faut modifier la section &amp;lt;code&amp;gt;platform_toolsets&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On supprime les occurrences de &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; dans les sections souhaitées.&lt;br /&gt;
&lt;br /&gt;
Il faut également éviter les toolsets composites susceptibles de les réintroduire, comme &amp;lt;code&amp;gt;hermes_cli&amp;lt;/code&amp;gt;, et définir explicitement les outils souhaités.&lt;br /&gt;
&lt;br /&gt;
Pour les requêtes effectuées via l&#039;API Hermes, notamment depuis OpenWebUI, on crée également une section &amp;lt;code&amp;gt;api_server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 platform_toolsets:&lt;br /&gt;
   cli:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - messaging&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   telegram:&lt;br /&gt;
     - hermes-telegram&lt;br /&gt;
 &lt;br /&gt;
   discord:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - file&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - vision&lt;br /&gt;
 &lt;br /&gt;
   api_server:&lt;br /&gt;
     - clarify&lt;br /&gt;
     - code_execution&lt;br /&gt;
     - computer_use&lt;br /&gt;
     - context_engine&lt;br /&gt;
     - cronjob&lt;br /&gt;
     - delegation&lt;br /&gt;
     - discord&lt;br /&gt;
     - discord_admin&lt;br /&gt;
     - file&lt;br /&gt;
     - homeassistant&lt;br /&gt;
     - image_gen&lt;br /&gt;
     - mcp&lt;br /&gt;
     - memory&lt;br /&gt;
     - session_search&lt;br /&gt;
     - skills&lt;br /&gt;
     - spotify&lt;br /&gt;
     - stt&lt;br /&gt;
     - terminal&lt;br /&gt;
     - todo&lt;br /&gt;
     - tts&lt;br /&gt;
     - video&lt;br /&gt;
     - video_gen&lt;br /&gt;
     - vision&lt;br /&gt;
     - x_search&lt;br /&gt;
     - yuanbao&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = modéré&lt;br /&gt;
 | icône = modéré&lt;br /&gt;
 | texte = La liste ci-dessus est un exemple. Conserver uniquement les outils réellement utilisés. Le point important est de ne pas inclure &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browser&amp;lt;/code&amp;gt; ni un toolset composite susceptible de les réintroduire, tout en conservant &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; si les serveurs MCP doivent rester accessibles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4679</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4679"/>
		<updated>2026-08-28T12:23:49Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP-CamoFox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le [[Hermes#MCP-SearXNG|MCP-SearXNG]]) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4678</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4678"/>
		<updated>2026-08-28T12:23:06Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP-CamoFox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (avec le MCP SearXNG) (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - For browser navigation, clicking, typing, page interaction, snapshots, screenshots, or rendered page inspection, use the Camofox MCP tools.&lt;br /&gt;
 - Do not use Camofox web_search for general web searches; use searxng_web_search instead.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
 - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
 - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4677</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4677"/>
		<updated>2026-08-28T12:20:21Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP-CamoFox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   TOOLS:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Use Camofox MCP only when browser navigation or interaction with a webpage is required.&lt;br /&gt;
   - Do not use memory or local file search for ordinary web lookups.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Do not use memory for ordinary factual lookups, web searches, image searches, or one-off questions unless the user explicitly asks to remember or recall something.&lt;br /&gt;
   - Do not search local files for ordinary factual or web questions unless the user explicitly asks about local files or documents.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
 [ ] 🌐 Browser Automation  (navigate, click, type, scroll)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4676</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4676"/>
		<updated>2026-08-28T12:15:10Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP-SearXNG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher pour les environnements concernés :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4675</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4675"/>
		<updated>2026-08-28T12:14:13Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Via MCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#MCP-CamoFox|MCP-CamoFox]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4674</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4674"/>
		<updated>2026-08-28T12:12:51Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* CamoFox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
On édite le fichier suivant :&lt;br /&gt;
 # vi ~/.hermes/SOUL.md&lt;br /&gt;
Puis on modifie le contenu de &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt;, qui constitue la partie personnalisée du prompt système de Hermes, par exemple :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;You are Hermes Agent, an intelligent AI assistant created by Nous Research. You are helpful, knowledgeable, and direct. You assist users with a wide range of tasks including answering questions, writing and editing code, analyzing information, creative work, and executing actions via your tools. You communicate clearly, admit uncertainty when appropriate, and prioritize being genuinely useful over being verbose unless otherwise directed below. Be targeted and efficient in your exploration and investigations.&amp;lt;/font&amp;gt;&lt;br /&gt;
      TOOLS:&lt;br /&gt;
      - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
      - To read a specific URL, use web_url_read.&lt;br /&gt;
      - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
      - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
      - 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.&lt;br /&gt;
      RULES:&lt;br /&gt;
      - Respond in the same language as the user.&lt;br /&gt;
      - Do not invent tool results.&lt;br /&gt;
      - If a tool fails, say so explicitly.&lt;br /&gt;
      - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
      - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
      - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
      - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
      - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
      - Use search categories when relevant.&lt;br /&gt;
      - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
      - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
      - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
      - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
      - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)&lt;br /&gt;
      - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
      - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
      - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | 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&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 systemctl stop signal-cli || true&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w &#039;%{url_effective}&#039; &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 &lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 rm -rf &amp;quot;/opt/signal-cli-${VERSION}&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 &lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm -f &amp;quot;/tmp/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     ERROR=&amp;quot;$(signal-cli --version 2&amp;gt;&amp;amp;1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     echo &amp;quot;$ERROR&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     REQUIRED=&amp;quot;$(echo &amp;quot;$ERROR&amp;quot; | grep -oE &#039;class file (version|major version) [0-9]+&#039; | grep -oE &#039;[0-9]+&#039; | tail -n1 || true)&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -z &amp;quot;$REQUIRED&amp;quot; ]; then&lt;br /&gt;
         echo &amp;quot;Impossible de détecter automatiquement la version Java requise.&amp;quot;&lt;br /&gt;
         echo &amp;quot;Installation de Java 21 par défaut...&amp;quot;&lt;br /&gt;
         JAVA_VERSION=21&lt;br /&gt;
     else&lt;br /&gt;
         JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
         echo &amp;quot;Class file version $REQUIRED détectée =&amp;gt; Java $JAVA_VERSION requis.&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     apt update&lt;br /&gt;
     apt install -y &amp;quot;openjdk-${JAVA_VERSION}-jre-headless&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     if [ -x &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot; ]; then&lt;br /&gt;
         update-alternatives --set java &amp;quot;/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&amp;quot;&lt;br /&gt;
     else&lt;br /&gt;
         echo &amp;quot;Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :&amp;quot;&lt;br /&gt;
         echo &amp;quot;update-alternatives --config java&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
=== SearXNG ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = modéré&lt;br /&gt;
| icône = information&lt;br /&gt;
| texte = L’intégration native de SearXNG dans Hermes Agent convient aux recherches web classiques et offre une configuration plus simple. Pour un accès plus complet aux fonctions de SearXNG, notamment aux catégories images, vidéos, actualités et à certains paramètres avancés, il est préférable d’utiliser [[Hermes#SearXNG_2|le serveur MCP SearXNG]].&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🔍 Web Search &amp;amp; Scraping&lt;br /&gt;
&lt;br /&gt;
 → (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]&lt;br /&gt;
Entrer ensuite l’adresse de l’instance SearXNG :&lt;br /&gt;
 SearXNG instance URL (e.g. &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;localhost:8080) (Enter to keep current):&lt;br /&gt;
&lt;br /&gt;
=== Camofox ===&lt;br /&gt;
==== Installation native ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =  &lt;br /&gt;
Déconseillé en cas d&#039;utilisation conjointe avec le MCP SearXNG afon de pouvoir désactiver les outils web natifs de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
Il faut d’abord avoir [[Camofox|installé une instance Camofox]].&lt;br /&gt;
&lt;br /&gt;
Sur le serveur Hermes, lancer :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
 → (○) Reconfigure an existing tool&#039;s provider or API key&lt;br /&gt;
&lt;br /&gt;
 → (○) 🌐 Browser Automation&lt;br /&gt;
&lt;br /&gt;
 → (●) Camofox [free · local] — Anti-detection browser (Firefox/Camoufox)&lt;br /&gt;
Entrer ensuite l’adresse de l’instance Camofox:&lt;br /&gt;
 Camofox server URL (Enter to keep current):&lt;br /&gt;
* Règle prompt système facultative :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
   RULES:&amp;lt;/font&amp;gt;&lt;br /&gt;
   - If `web_extract` fails or is blocked, use `browser_navigate` through the Camofox browser provider.&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
==== Via MCP ====&lt;br /&gt;
Voir [[Hermes#CamoFox_2|CamoFox MCP]]&lt;br /&gt;
&lt;br /&gt;
=== Forcer les timeouts d&#039;une IA locale pour une IA derrière une URL ===&lt;br /&gt;
Si l&#039;API de votre IA locale est desservie derrière une URL publique, Hermes peut ne pas la détecter comme un fournisseur local. Il est possible de modifier les timeouts utilisés pour les fournisseurs locaux :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_API_TIMEOUT=1800&lt;br /&gt;
 HERMES_STREAM_READ_TIMEOUT=1800&lt;br /&gt;
 # HERMES_STREAM_STALE_TIMEOUT=180&lt;br /&gt;
 HERMES_API_CALL_STALE_TIMEOUT=900&lt;br /&gt;
 HERMES_AGENT_TIMEOUT=900&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Fonctions auxiliaires ===&lt;br /&gt;
Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.&lt;br /&gt;
&lt;br /&gt;
Editer la section &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt; dans :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : analyse d’images (modèle multimodal avec vision)&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : extraction et synthèse de contenu web (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; : recherche et sélection de compétences (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : évaluation et validation des actions sensibles (LLM texte léger et fiable)&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : génération de titres de conversations (petit LLM texte rapide)&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; : génération de balises expressives pour la synthèse vocale (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : classification et orientation des demandes (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : génération d’une description de profil (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : analyse des résultats de surveillance (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : révision et analyse en arrière-plan (LLM texte)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : production d’une réponse de référence pour le MoA (LLM texte performant)&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)&lt;br /&gt;
* &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
==== Note sur vision et les modèles principaux multimodaux ====&lt;br /&gt;
&lt;br /&gt;
Certains modèles principaux (ex. Qwen3.6-27B) sont &#039;&#039;&#039;nativement multimodaux&#039;&#039;&#039; (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 &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :&lt;br /&gt;
&lt;br /&gt;
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.&lt;br /&gt;
# Le petit modèle peut se décharger automatiquement (&amp;lt;code&amp;gt;--sleep-idle-seconds&amp;lt;/code&amp;gt;), pas forcément possible/souhaitable sur le principal.&lt;br /&gt;
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.&lt;br /&gt;
&lt;br /&gt;
==== Recommandations ====&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : 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. &#039;&#039;&#039;Pour de l’OCR/transcription de texte dense&#039;&#039;&#039;, augmenter &amp;lt;code&amp;gt;--image-min-tokens&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--image-max-tokens&amp;lt;/code&amp;gt; (ex. 2048/8192) et ajouter un &amp;lt;code&amp;gt;--repeat-penalty 1.1&amp;lt;/code&amp;gt; pour éviter les boucles de génération sur du texte peu lisible à basse résolution.&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : 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 — &#039;&#039;&#039;à éviter si le modèle principal tourne avec un gros contexte (100K+)&#039;&#039;&#039;, préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; : 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; : modèle texte performant (14 milliards de paramètres ou plus).&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).&lt;br /&gt;
&lt;br /&gt;
Pour une première optimisation, il est conseillé de configurer en priorité :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; : modèle multimodal de 3 à 4 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; : modèle texte de 0,5 à 3 milliards de paramètres&lt;br /&gt;
* &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; : modèle texte de 3 à 8 milliards de paramètres avec contexte long&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé&lt;br /&gt;
&lt;br /&gt;
Les autres fonctions peuvent rester sur &amp;lt;code&amp;gt;provider: auto&amp;lt;/code&amp;gt; tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.&lt;br /&gt;
&lt;br /&gt;
==== Contexte recommandé par fonction ====&lt;br /&gt;
&lt;br /&gt;
Le sur-dimensionnement du contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || Ne voit que les 1-2 premiers messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || Passage de texte court à annoter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4K || Juste la requête à classifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || Liste de compétences + requête&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; || 8K || Résultats de recherche à trier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || Selon la taille des logs surveillés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; || 8K || Candidats mémoire à évaluer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || Historique modéré&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || Action proposée + contexte suffisant&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || Selon le nombre d’outils déclarés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || Description de projet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || Peut agréger plusieurs sources&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || Selon ce qui est passé en revue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; || 32K || Recommandation explicite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K || Réponses de référence potentiellement longues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Quantification (poids du modèle) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tâches à faible enjeu&#039;&#039;&#039; (&amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;) : Q4_K_M suffit largement.&lt;br /&gt;
* &#039;&#039;&#039;Tâches à enjeu réel&#039;&#039;&#039; (&amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt;) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &amp;amp;lt; 1,5 Go), autant prendre la marge.&lt;br /&gt;
&lt;br /&gt;
==== KV cache (contexte) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En dessous de 16K de contexte&#039;&#039;&#039; : 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&#039;en priver même à faible contexte.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; simple devient intéressant, gain notable pour un risque quasi nul.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; à 64K+&#039;&#039;&#039; : seule route où une approche plus poussée type &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q6_0&amp;lt;/code&amp;gt; + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
=== Réglages de la voix ===&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;en-US-AriaNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Parmi les options gratuites et simples proposées par Hermes, Edge constitue probablement le meilleur choix par défaut. Il est toutefois recommandé de sélectionner une voix adaptée à la langue utilisée. Exemple pour le français :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color = green&amp;gt;edge&amp;lt;/font&amp;gt;&lt;br /&gt;
   edge:&lt;br /&gt;
     voice: &amp;lt;font color = blue&amp;gt;fr-FR-DeniseNeural&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
===== TTS via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Text-to-Speech|CrispASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API de synthèse vocale compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer le texte au serveur TTS.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 tts:&lt;br /&gt;
   provider: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;openai&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;qwen3-tts-12hz-0.6b-base-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
     voice: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;default&amp;lt;/font&amp;gt;&lt;br /&gt;
     base_url: http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque CrispASR est lancé avec une voix de référence fixe, la valeur &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; peut être utilisée pour l’option &amp;lt;code&amp;gt;voice&amp;lt;/code&amp;gt;. La voix réellement utilisée dépend alors du fichier WAV et de sa transcription chargés par le serveur.&lt;br /&gt;
&lt;br /&gt;
Le nom du modèle exposé peut être vérifié avec la commande suivante :&lt;br /&gt;
&lt;br /&gt;
 curl http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1/models&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Speech-to-Text (STT) ====&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Configuration par défaut :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: local&lt;br /&gt;
   local:&lt;br /&gt;
     model: base&lt;br /&gt;
     language: &#039;&#039;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: whisper-1&lt;br /&gt;
   mistral:&lt;br /&gt;
     model: voxtral-mini-latest&lt;br /&gt;
   elevenlabs:&lt;br /&gt;
     model_id: scribe_v2&lt;br /&gt;
     language_code: &#039;&#039;&lt;br /&gt;
     tag_audio_events: false&lt;br /&gt;
     diarize: false&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Le Speech-to-Text permet de convertir les enregistrements vocaux en texte. Par défaut, Hermes utilise localement &amp;lt;code&amp;gt;faster-whisper&amp;lt;/code&amp;gt; avec le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;. Cette solution est gratuite, ne nécessite aucune clé API et conserve les enregistrements sur la machine.&lt;br /&gt;
&lt;br /&gt;
Lorsque le champ &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; reste vide, la langue est détectée automatiquement. Il est toutefois possible de préciser la langue afin de limiter les erreurs de détection, par exemple avec &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; pour le français.&lt;br /&gt;
&lt;br /&gt;
Le modèle &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; offre un bon compromis entre rapidité et consommation de ressources, mais il peut manquer de précision avec les noms propres, les nombres, les adresses IP ou les termes techniques. Il est alors possible d’utiliser un modèle local plus volumineux, par exemple &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;. Plus le modèle est grand, plus la transcription est généralement précise, mais plus elle demande de mémoire et de temps de traitement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec un modèle local plus précis configuré pour le français :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
 enabled: true&lt;br /&gt;
 provider: local&lt;br /&gt;
 local:&lt;br /&gt;
  model: small&lt;br /&gt;
  language: fr&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hermes peut également utiliser un service externe de reconnaissance vocale, par exemple OpenAI, Mistral ou ElevenLabs. Dans ce cas, il suffit de sélectionner le fournisseur souhaité avec l’option &amp;lt;code&amp;gt;provider&amp;lt;/code&amp;gt; et de renseigner la clé API correspondante dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt;.&lt;br /&gt;
===== STT via CrispASR =====&lt;br /&gt;
Voir [[CrispASR#Speech-to-Text|CrisASR]]&lt;br /&gt;
&lt;br /&gt;
CrispASR expose une API compatible avec l’API audio d’OpenAI. Hermes doit donc utiliser le fournisseur &amp;lt;code&amp;gt;openai&amp;lt;/code&amp;gt; pour envoyer les fichiers audio au serveur.&lt;br /&gt;
&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/config.yaml&amp;lt;/code&amp;gt; (exemple avec parakeet-tdt-0.6b-v3) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 stt:&lt;br /&gt;
   enabled: true&lt;br /&gt;
   provider: openai&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;local:&lt;br /&gt;
     model: small&lt;br /&gt;
     language: &#039;fr&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
   openai:&lt;br /&gt;
     model: &amp;lt;font color = blue&amp;gt;parakeet-tdt-0.6b-v3-q8_0&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
* Dans le fichier &amp;lt;code&amp;gt;~/.hermes/.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 VOICE_TOOLS_OPENAI_KEY=local&lt;br /&gt;
 STT_OPENAI_BASE_URL=http://&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;IP_CRISPASR&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7980&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = &lt;br /&gt;
La valeur &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; sert uniquement de clé fictive lorsque l’authentification n’est pas activée sur CrispASR. Hermes exige néanmoins qu’une clé soit définie pour utiliser le fournisseur OpenAI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Après modification, on redémarre Hermes afin que la nouvelle configuration soit prise en compte.&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#MCP-SearXNG|MCP-SearXNG]] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Depuis la version 0.7, SearXNG est pris en charge nativement par Hermes Agent pour les recherches web classiques. Un serveur MCP dédié n’est donc plus indispensable dans ce cas. En revanche, le MCP SearXNG reste utile pour accéder aux catégories spécialisées telles que les images, les vidéos ou d’autres paramètres avancés qui ne sont pas encore pleinement exposés par l’intégration native. Voir [[Hermes#SearXNG|configuration native SearXNG]]&lt;br /&gt;
 }}&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use web_url_read.&lt;br /&gt;
   - For search suggestions, use searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- For system tasks, use terminal.&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   &amp;lt;font color=grey&amp;gt;- Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&amp;lt;/font&amp;gt;&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use searxng_web_search with categories=videos.&lt;br /&gt;
   - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
   - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
   - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
=== Skill pour aider la recherche et l&#039;affichage d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;SOUL.md&amp;lt;/code&amp;gt; on remplace :&lt;br /&gt;
&lt;br /&gt;
 - For image searches, use searxng_web_search with categories=images.&lt;br /&gt;
 - For image search results, use the `img_src` field as the direct image URL.&lt;br /&gt;
 - When displaying an image result, ALWAYS output the direct image URL exactly in this format: ![](URL)&lt;br /&gt;
 - Do not output the image URL as a normal Markdown link.&lt;br /&gt;
&lt;br /&gt;
Par :&lt;br /&gt;
&lt;br /&gt;
 - For any image or photo search, ALWAYS load and follow the `searxng-photo` skill before using any search, browser, or web tool.&lt;br /&gt;
&lt;br /&gt;
Puis on crée le skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/searxng-photo&lt;br /&gt;
 # vi ~/.hermes/skills/searxng-photo/SKILL.md&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
name: searxng-photo&lt;br /&gt;
description: Find and display an image using the SearXNG MCP image search tool.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Use this skill when asked to find, show, or search for an image or photo.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;br /&gt;
1. Call `mcp__searxng__searxng_web_search` with:&lt;br /&gt;
   - `query`: a concise image search query&lt;br /&gt;
   - `categories`: `&amp;quot;images&amp;quot;`&lt;br /&gt;
   - `num_results`: `5`&lt;br /&gt;
   - `response_format`: `&amp;quot;json&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
2. Select a relevant result containing `img_src`.&lt;br /&gt;
&lt;br /&gt;
3. For each selected image result, output its direct `img_src` URL using this exact Markdown format:&lt;br /&gt;
&lt;br /&gt;
![](DIRECT_IMAGE_URL)&lt;br /&gt;
&lt;br /&gt;
Replace `DIRECT_IMAGE_URL` with the exact value of the result&#039;s `img_src` field.&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
- `categories` must be the string `&amp;quot;images&amp;quot;`, not an array.&lt;br /&gt;
- Use `num_results`, not `max_results`.&lt;br /&gt;
- Use the exact returned `img_src`.&lt;br /&gt;
- Once a usable `img_src` is found, do not call another tool.&lt;br /&gt;
- If no usable `img_src` is found, retry once with a better query.&lt;br /&gt;
- Do not output the image URL as a normal link.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [[RAGFlow|RAGFlow]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP RAGFlow (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   ragflow:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;9382&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test ragflow&lt;br /&gt;
&lt;br /&gt;
Prompt système recommandé :&lt;br /&gt;
  TOOLS:&lt;br /&gt;
  - 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.&lt;br /&gt;
 &lt;br /&gt;
  RULES:&lt;br /&gt;
  - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.&lt;br /&gt;
  - If no RAGFlow dataset exists or no relevant result is found, say so clearly.&lt;br /&gt;
=== Rerank ===&lt;br /&gt;
&lt;br /&gt;
Il faut d’abord identifier l’identifiant complet du modèle de reranking.&lt;br /&gt;
&lt;br /&gt;
[[File:Hermes ragflow rerank.webp|Exemple de reranker configuré dans RAGFlow.]]&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, l’identifiant est :&lt;br /&gt;
&lt;br /&gt;
 /opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite créer un skill Hermes afin de demander l’utilisation systématique du reranker lors des appels à &amp;lt;code&amp;gt;ragflow_retrieval&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Créer le dossier du skill :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p ~/.hermes/skills/ragflow-search&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier principal du skill :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/skills/ragflow-search/SKILL.md&lt;br /&gt;
&lt;br /&gt;
Y placer le contenu suivant :&lt;br /&gt;
&lt;br /&gt;
 ---&lt;br /&gt;
 name: ragflow-search&lt;br /&gt;
 description: Use this skill whenever querying RAGFlow datasets through the `ragflow_retrieval` MCP tool. Always include the configured reranker.&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 ---&lt;br /&gt;
 &lt;br /&gt;
 # RAGFlow Search&lt;br /&gt;
 &lt;br /&gt;
 Use this skill for every call to the `ragflow_retrieval` MCP tool.&lt;br /&gt;
 &lt;br /&gt;
 ## Tool&lt;br /&gt;
 &lt;br /&gt;
 Call the MCP tool:&lt;br /&gt;
 &lt;br /&gt;
 `ragflow_retrieval`&lt;br /&gt;
 &lt;br /&gt;
 Do not use a generic web search when the requested information is expected to be present in RAGFlow.&lt;br /&gt;
 &lt;br /&gt;
 ## Mandatory reranker&lt;br /&gt;
 &lt;br /&gt;
 For every call to `ragflow_retrieval`, always include this exact argument:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 rerank_id: &amp;quot;&amp;lt;font color = blue&amp;gt;/opt/models/jina-reranker-v3/Q8_0/jina-reranker-v3-Q8_0.gguf@Serveur Rerank@OpenAI-API-Compatible&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 Do not omit, shorten, rename, translate, or modify this value.&lt;br /&gt;
 &lt;br /&gt;
 ## Dataset selection&lt;br /&gt;
 &lt;br /&gt;
 - Use `ragflow_list_datasets` when the relevant dataset ID is unknown.&lt;br /&gt;
 - Prefer selecting only the datasets relevant to the question.&lt;br /&gt;
 - Do not invent dataset IDs.&lt;br /&gt;
 - Omit `dataset_ids` only when searching across all datasets is appropriate.&lt;br /&gt;
 &lt;br /&gt;
 ## Recommended retrieval parameters&lt;br /&gt;
 &lt;br /&gt;
 Use these defaults unless the task requires otherwise:&lt;br /&gt;
 &lt;br /&gt;
 ```yaml&lt;br /&gt;
 page: 1&lt;br /&gt;
 page_size: 10&lt;br /&gt;
 top_k: 30&lt;br /&gt;
 similarity_threshold: 0.2&lt;br /&gt;
 vector_similarity_weight: 0.3&lt;br /&gt;
 keyword: false&lt;br /&gt;
 ```&lt;br /&gt;
 &lt;br /&gt;
 ## Verification&lt;br /&gt;
 &lt;br /&gt;
 Do not claim that reranking was used unless `rerank_id` was actually included in the tool call.&lt;br /&gt;
 &lt;br /&gt;
 If `ragflow_retrieval` is called without `rerank_id`, treat the call as invalid and retry it with the exact configured value.&lt;br /&gt;
&lt;br /&gt;
Une fois le fichier enregistré, démarrer une nouvelle session Hermes afin que le skill soit détecté.&lt;br /&gt;
== [[IA_MCP#CamoFox_MCP|MCP-CamoFox]] ==&lt;br /&gt;
On inscrit le serveur MCP CamoFox (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   camofox:&lt;br /&gt;
     url: http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&lt;br /&gt;
     headers:&lt;br /&gt;
      Authorization: Bearer &amp;lt;font color=blue&amp;gt;UNE_CLE_ALEATOIRE_DE_32_CARACTERES_MINIMUM&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche).&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test camofox&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>