<?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-10-29T06:36:51Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5138</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5138"/>
		<updated>2026-10-28T13:18:55Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Hermes Web Search Plus avec DonSeTch */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
=== Garder toutes les parties de réponse ouvertes (extension keep-expanded) ===&lt;br /&gt;
Par défaut, Hermes WebUI replie automatiquement les parties intermédiaires d&#039;une réponse (le texte que l&#039;IA écrit entre deux appels d&#039;outils) dès qu&#039;il y en a plus de 3 : un lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; apparaît pour les retrouver. Ce comportement est codé en dur (&amp;lt;code&amp;gt;INTERIM_COLLAPSE_THRESHOLD=3&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;static/messages.js&amp;lt;/code&amp;gt;) et ne propose aucune option. Les modèles qui produisent beaucoup de petites notes de progression (Qwen par exemple) le rendent vite pénible, car le bloc de code final peut se retrouver dans une partie repliée.&lt;br /&gt;
&lt;br /&gt;
Le WebUI supporte les extensions CSS (voir &amp;lt;code&amp;gt;docs/EXTENSIONS.md&amp;lt;/code&amp;gt; dans le dépôt). Voici une petite extension maison qui désactive ce repli.&lt;br /&gt;
&lt;br /&gt;
* Étape 1 — Créer le fichier CSS :&lt;br /&gt;
 # mkdir -p ~/.hermes/webui/extensions&lt;br /&gt;
 # vi ~/.hermes/webui/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
Y coller :&lt;br /&gt;
&lt;br /&gt;
 /* Extension hermes-webui : garder depliee chaque segment de reponse&lt;br /&gt;
    (desactive le repli automatique des notes intermediaires). */&lt;br /&gt;
 .interim-collapsed { display: revert !important; }&lt;br /&gt;
 .interim-collapse-toggle { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
* Étape 2 — Déclarer l&#039;extension au service : le service systemd lit déjà &amp;lt;code&amp;gt;EnvironmentFile=-/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (voir le service plus haut), on y ajoute donc deux lignes :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_DIR=/root/.hermes/webui/extensions&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
* Étape 3 — Redémarrer et vérifier :&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
 # systemctl is-active hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Puis recharger la page du WebUI dans le navigateur (F5) : toutes les parties des réponses restent ouvertes, et le lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; a disparu.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Redémarrer le service coupe brièvement la session WebUI en cours (les conversations sont sauvegardées, mais la réponse en cours de rédaction peut être perdue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retour en arrière :&#039;&#039;&#039; supprimer les deux lignes de &amp;lt;code&amp;gt;/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (ou le fichier CSS), puis relancer le service — le repli automatique revient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résistance aux mises à jour :&#039;&#039;&#039; cette configuration survit aux mises à jour normales (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/opt/hermes-webui&amp;lt;/code&amp;gt; puis redémarrage) :&lt;br /&gt;
* &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; est listé dans le &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; du projet : git ne le touche jamais ;&lt;br /&gt;
* le CSS vit dans &amp;lt;code&amp;gt;~/.hermes/webui/extensions/&amp;lt;/code&amp;gt;, hors du dépôt git — c&#039;est le répertoire officiellement recommandé pour les extensions.&lt;br /&gt;
&lt;br /&gt;
Seuls une réinstallation complète (suppression + re-clone) ou un changement de nom des classes &amp;lt;code&amp;gt;interim-collapsed&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;interim-collapse-toggle&amp;lt;/code&amp;gt; côté développeur pourraient casser l&#039;extension. Si le repli revient tout seul après une mise à jour, il suffit de vérifier ces sélecteurs dans le CSS.&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SearXNG et Firecrawl comme services locaux. Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe et active le plugin :&lt;br /&gt;
 # hermes plugins install web-search-plus --enable&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; si l’installation des dépendances Node est proposée :&lt;br /&gt;
 Install them into the plugin&#039;s own node_modules now? [y/N]: y&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si une autorisation est demandée :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
&lt;br /&gt;
On initialise le plugin avec le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # hermes web-search-plus setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
L’assistant propose ensuite d’activer Jev :&lt;br /&gt;
 Enable optional Jev (TypeSafe) for search-type overlay, extract quality, and language fill? [y/N]:&lt;br /&gt;
&lt;br /&gt;
Jev est un service extérieur optionnel utilisé pour améliorer la détection du type de recherche, l’évaluation des extractions et la détection de la langue. Il n’est pas nécessaire pour une configuration locale avec SearXNG, DonSeTch et Firecrawl. Répondre :&lt;br /&gt;
 n&lt;br /&gt;
&lt;br /&gt;
On renseigne l’adresse de l’instance SearXNG :&lt;br /&gt;
 # hermes config set SEARXNG_INSTANCE_URL &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l’autoriser explicitement :&lt;br /&gt;
 # hermes config set SEARXNG_ALLOW_PRIVATE 1&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; peut utiliser Keenable comme service de secours extérieur sans clé API. Pour l’autoriser :&lt;br /&gt;
 # hermes config set KEENABLE_ALLOW_PUBLIC 1&lt;br /&gt;
&lt;br /&gt;
Cette commande doit être omise pour conserver une configuration strictement locale.&lt;br /&gt;
&lt;br /&gt;
Pour que Web Search Plus considère Firecrawl comme configuré, une valeur doit être renseignée dans &amp;lt;code&amp;gt;FIRECRAWL_API_KEY&amp;lt;/code&amp;gt;. Si l’instance locale n’utilise aucune authentification, employer une valeur factice :&lt;br /&gt;
 # hermes config set FIRECRAWL_API_KEY &amp;lt;font color = blue&amp;gt;local-firecrawl&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
&lt;br /&gt;
Pour s&#039;assurer que le service Hermes puisse trouver Node :&lt;br /&gt;
 # test -e /usr/local/bin/node || ln -s /root/.local/bin/node /usr/local/bin/node&lt;br /&gt;
&lt;br /&gt;
On installe Chromium et Xvfb pour les fonctions nécessitant un navigateur :&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install chromium xvfb&lt;br /&gt;
&lt;br /&gt;
On vérifie le fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
On enregistre le chemin du binaire dans le profil Hermes :&lt;br /&gt;
 # hermes config set DONSETCH_BIN /root/.hermes/node/bin/donsetch&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite le routage automatique à SearXNG et Keenable. Pour utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l’extraction, on réinitialise la configuration avec le profil standard :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
&lt;br /&gt;
On désactive les fournisseurs inutilisés :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On définit les priorités de recherche et d’extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On autorise l’utilisation automatique de DonSeTch :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Si Keenable a été activé, on le définit comme fournisseur de secours :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
Cette commande doit également être omise pour conserver une configuration strictement locale.&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; ajoute l’autorisation d’utiliser le service public Keenable dans le fichier de routage du plugin. Ce réglage étant ignoré sous Hermes, il faut supprimer uniquement le bloc correspondant dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
On édite le fichier de routage :&lt;br /&gt;
 # vi ~/.hermes/plugins/config.json&lt;br /&gt;
&lt;br /&gt;
On supprime uniquement le bloc suivant :&lt;br /&gt;
    &amp;quot;keenable&amp;quot;: {&lt;br /&gt;
        &amp;quot;allow_public&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
Il ne faut pas supprimer les autres occurrences de &amp;lt;code&amp;gt;keenable&amp;lt;/code&amp;gt;, notamment celles qui le définissent comme fournisseur de secours.&lt;br /&gt;
&lt;br /&gt;
On ajoute ou modifie ensuite l’objet &amp;lt;code&amp;gt;firecrawl&amp;lt;/code&amp;gt; situé à la racine du fichier :&lt;br /&gt;
   &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
     &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
     &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/scrape&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
L’option suivante n’est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
   &amp;quot;extract&amp;quot;: {&lt;br /&gt;
     &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;true&amp;lt;/font&amp;gt;&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
Les objets doivent être séparés par une virgule afin de conserver un fichier JSON valide. Les valeurs booléennes JSON s’écrivent en minuscules : &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Hermes peut réessayer automatiquement les appels Web qui échouent auprès de services externes anonymes comme Exa, Parallel, Firecrawl ou Keenable. Web Search Plus disposant déjà de son propre fournisseur de secours, on désactive ce second mécanisme :&lt;br /&gt;
 # hermes config set web.keyless_rescue false&lt;br /&gt;
&lt;br /&gt;
On vérifie la syntaxe du fichier de routage :&lt;br /&gt;
 # python3 -m json.tool ~/.hermes/plugins/config.json &amp;gt;/dev/null &amp;amp;&amp;amp; echo &amp;quot;JSON valide&amp;quot;&lt;br /&gt;
&lt;br /&gt;
On vérifie la configuration finale :&lt;br /&gt;
 # hermes web-search-plus status&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
Web Search Plus peut servir directement de backend aux outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active Web Search Plus pour la recherche et l’extraction :&lt;br /&gt;
 # hermes config set web.search_backend wsp&lt;br /&gt;
 # hermes config set web.extract_backend wsp&lt;br /&gt;
&lt;br /&gt;
Le backend &amp;lt;code&amp;gt;wsp&amp;lt;/code&amp;gt; ne doit être sélectionné pour l’extraction que si au moins un fournisseur compatible est disponible, comme DonSeTch ou Firecrawl.&lt;br /&gt;
&lt;br /&gt;
Les outils natifs nécessitent que le toolset &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; reste activé. Si celui-ci figure dans &amp;lt;code&amp;gt;agent.disabled_toolsets&amp;lt;/code&amp;gt;, il faut le retirer.&lt;br /&gt;
&lt;br /&gt;
On vérifie l’intégration :&lt;br /&gt;
 # hermes web-search-plus fastpath&lt;br /&gt;
 # hermes web-search-plus status&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
On teste directement le fournisseur Firecrawl :&lt;br /&gt;
 # cd ~/.hermes/plugins/web-search-plus&lt;br /&gt;
 # FIRECRAWL_API_KEY=&amp;lt;font color = green&amp;gt;local-firecrawl&amp;lt;/font&amp;gt; python3 search.py --query &amp;quot;Hermes Agent latest release&amp;quot; --provider firecrawl --quality-report&lt;br /&gt;
&lt;br /&gt;
On lance ensuite Hermes :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
On lui demande d’effectuer une recherche avec Web Search Plus :&lt;br /&gt;
 Recherche la dernière version de Hermes Agent en utilisant web_search_plus et indique le fournisseur utilisé.&lt;br /&gt;
&lt;br /&gt;
On peut également demander un test explicite de DonSeTch :&lt;br /&gt;
 Recherche la documentation de Hermes Agent avec web_search_plus en imposant le fournisseur donsetch.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
&lt;br /&gt;
Si l’installation des dépendances Node est de nouveau proposée, répondre &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après une mise à jour. Si nécessaire, le réactiver :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
* DonSeTch&lt;br /&gt;
On met à jour DonSeTch vers la dernière version disponible :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
Sources :&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/USER_GUIDE.md Guide de Web Search Plus]&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/DONSETCH.md Intégration de DonSeTch]&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/NATIVE_BACKEND.md Backend natif Hermes]&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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=5137</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5137"/>
		<updated>2026-10-28T12:04:48Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Test */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
=== Garder toutes les parties de réponse ouvertes (extension keep-expanded) ===&lt;br /&gt;
Par défaut, Hermes WebUI replie automatiquement les parties intermédiaires d&#039;une réponse (le texte que l&#039;IA écrit entre deux appels d&#039;outils) dès qu&#039;il y en a plus de 3 : un lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; apparaît pour les retrouver. Ce comportement est codé en dur (&amp;lt;code&amp;gt;INTERIM_COLLAPSE_THRESHOLD=3&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;static/messages.js&amp;lt;/code&amp;gt;) et ne propose aucune option. Les modèles qui produisent beaucoup de petites notes de progression (Qwen par exemple) le rendent vite pénible, car le bloc de code final peut se retrouver dans une partie repliée.&lt;br /&gt;
&lt;br /&gt;
Le WebUI supporte les extensions CSS (voir &amp;lt;code&amp;gt;docs/EXTENSIONS.md&amp;lt;/code&amp;gt; dans le dépôt). Voici une petite extension maison qui désactive ce repli.&lt;br /&gt;
&lt;br /&gt;
* Étape 1 — Créer le fichier CSS :&lt;br /&gt;
 # mkdir -p ~/.hermes/webui/extensions&lt;br /&gt;
 # vi ~/.hermes/webui/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
Y coller :&lt;br /&gt;
&lt;br /&gt;
 /* Extension hermes-webui : garder depliee chaque segment de reponse&lt;br /&gt;
    (desactive le repli automatique des notes intermediaires). */&lt;br /&gt;
 .interim-collapsed { display: revert !important; }&lt;br /&gt;
 .interim-collapse-toggle { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
* Étape 2 — Déclarer l&#039;extension au service : le service systemd lit déjà &amp;lt;code&amp;gt;EnvironmentFile=-/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (voir le service plus haut), on y ajoute donc deux lignes :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_DIR=/root/.hermes/webui/extensions&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
* Étape 3 — Redémarrer et vérifier :&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
 # systemctl is-active hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Puis recharger la page du WebUI dans le navigateur (F5) : toutes les parties des réponses restent ouvertes, et le lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; a disparu.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Redémarrer le service coupe brièvement la session WebUI en cours (les conversations sont sauvegardées, mais la réponse en cours de rédaction peut être perdue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retour en arrière :&#039;&#039;&#039; supprimer les deux lignes de &amp;lt;code&amp;gt;/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (ou le fichier CSS), puis relancer le service — le repli automatique revient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résistance aux mises à jour :&#039;&#039;&#039; cette configuration survit aux mises à jour normales (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/opt/hermes-webui&amp;lt;/code&amp;gt; puis redémarrage) :&lt;br /&gt;
* &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; est listé dans le &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; du projet : git ne le touche jamais ;&lt;br /&gt;
* le CSS vit dans &amp;lt;code&amp;gt;~/.hermes/webui/extensions/&amp;lt;/code&amp;gt;, hors du dépôt git — c&#039;est le répertoire officiellement recommandé pour les extensions.&lt;br /&gt;
&lt;br /&gt;
Seuls une réinstallation complète (suppression + re-clone) ou un changement de nom des classes &amp;lt;code&amp;gt;interim-collapsed&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;interim-collapse-toggle&amp;lt;/code&amp;gt; côté développeur pourraient casser l&#039;extension. Si le repli revient tout seul après une mise à jour, il suffit de vérifier ces sélecteurs dans le CSS.&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SearXNG et Firecrawl comme services locaux. Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe et active le plugin :&lt;br /&gt;
 # hermes plugins install web-search-plus --enable&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; si l’installation des dépendances Node est proposée :&lt;br /&gt;
 Install them into the plugin&#039;s own node_modules now? [y/N]: y&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si une autorisation est demandée :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
&lt;br /&gt;
On initialise le plugin avec le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # hermes web-search-plus setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
L’assistant propose ensuite d’activer Jev :&lt;br /&gt;
 Enable optional Jev (TypeSafe) for search-type overlay, extract quality, and language fill? [y/N]:&lt;br /&gt;
&lt;br /&gt;
Jev est un service extérieur optionnel utilisé pour améliorer la détection du type de recherche, l’évaluation des extractions et la détection de la langue. Il n’est pas nécessaire pour une configuration locale avec SearXNG, DonSeTch et Firecrawl. Répondre :&lt;br /&gt;
 n&lt;br /&gt;
&lt;br /&gt;
On renseigne l’adresse de l’instance SearXNG :&lt;br /&gt;
 # hermes config set SEARXNG_INSTANCE_URL &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l’autoriser explicitement :&lt;br /&gt;
 # hermes config set SEARXNG_ALLOW_PRIVATE 1&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; peut utiliser Keenable comme service de secours extérieur sans clé API. Pour l’autoriser :&lt;br /&gt;
 # hermes config set KEENABLE_ALLOW_PUBLIC 1&lt;br /&gt;
&lt;br /&gt;
Cette commande doit être omise pour conserver une configuration strictement locale.&lt;br /&gt;
&lt;br /&gt;
Pour que Web Search Plus considère Firecrawl comme configuré, une valeur doit être renseignée dans &amp;lt;code&amp;gt;FIRECRAWL_API_KEY&amp;lt;/code&amp;gt;. Si l’instance locale n’utilise aucune authentification, employer une valeur factice :&lt;br /&gt;
 # hermes config set FIRECRAWL_API_KEY &amp;lt;font color = blue&amp;gt;local-firecrawl&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
&lt;br /&gt;
On installe Chromium et Xvfb pour les fonctions nécessitant un navigateur :&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install chromium xvfb&lt;br /&gt;
&lt;br /&gt;
On vérifie le fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
On enregistre le chemin du binaire dans le profil Hermes :&lt;br /&gt;
 # hermes config set DONSETCH_BIN /root/.hermes/node/bin/donsetch&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite le routage automatique à SearXNG et Keenable. Pour utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l’extraction, on réinitialise la configuration avec le profil standard :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
&lt;br /&gt;
On désactive les fournisseurs inutilisés :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On définit les priorités de recherche et d’extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On autorise l’utilisation automatique de DonSeTch :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Si Keenable a été activé, on le définit comme fournisseur de secours :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
Cette commande doit également être omise pour conserver une configuration strictement locale.&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; ajoute l’autorisation d’utiliser le service public Keenable dans le fichier de routage du plugin. Ce réglage étant ignoré sous Hermes, il faut supprimer uniquement le bloc correspondant dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
On édite le fichier de routage :&lt;br /&gt;
 # vi ~/.hermes/plugins/config.json&lt;br /&gt;
&lt;br /&gt;
On supprime uniquement le bloc suivant :&lt;br /&gt;
    &amp;quot;keenable&amp;quot;: {&lt;br /&gt;
        &amp;quot;allow_public&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
Il ne faut pas supprimer les autres occurrences de &amp;lt;code&amp;gt;keenable&amp;lt;/code&amp;gt;, notamment celles qui le définissent comme fournisseur de secours.&lt;br /&gt;
&lt;br /&gt;
On ajoute ou modifie ensuite l’objet &amp;lt;code&amp;gt;firecrawl&amp;lt;/code&amp;gt; situé à la racine du fichier :&lt;br /&gt;
   &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
     &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
     &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/scrape&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
L’option suivante n’est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
   &amp;quot;extract&amp;quot;: {&lt;br /&gt;
     &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;true&amp;lt;/font&amp;gt;&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
Les objets doivent être séparés par une virgule afin de conserver un fichier JSON valide. Les valeurs booléennes JSON s’écrivent en minuscules : &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Hermes peut réessayer automatiquement les appels Web qui échouent auprès de services externes anonymes comme Exa, Parallel, Firecrawl ou Keenable. Web Search Plus disposant déjà de son propre fournisseur de secours, on désactive ce second mécanisme :&lt;br /&gt;
 # hermes config set web.keyless_rescue false&lt;br /&gt;
&lt;br /&gt;
On vérifie la syntaxe du fichier de routage :&lt;br /&gt;
 # python3 -m json.tool ~/.hermes/plugins/config.json &amp;gt;/dev/null &amp;amp;&amp;amp; echo &amp;quot;JSON valide&amp;quot;&lt;br /&gt;
&lt;br /&gt;
On vérifie la configuration finale :&lt;br /&gt;
 # hermes web-search-plus status&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
Web Search Plus peut servir directement de backend aux outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active Web Search Plus pour la recherche et l’extraction :&lt;br /&gt;
 # hermes config set web.search_backend wsp&lt;br /&gt;
 # hermes config set web.extract_backend wsp&lt;br /&gt;
&lt;br /&gt;
Le backend &amp;lt;code&amp;gt;wsp&amp;lt;/code&amp;gt; ne doit être sélectionné pour l’extraction que si au moins un fournisseur compatible est disponible, comme DonSeTch ou Firecrawl.&lt;br /&gt;
&lt;br /&gt;
Les outils natifs nécessitent que le toolset &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; reste activé. Si celui-ci figure dans &amp;lt;code&amp;gt;agent.disabled_toolsets&amp;lt;/code&amp;gt;, il faut le retirer.&lt;br /&gt;
&lt;br /&gt;
On vérifie l’intégration :&lt;br /&gt;
 # hermes web-search-plus fastpath&lt;br /&gt;
 # hermes web-search-plus status&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
On teste directement le fournisseur Firecrawl :&lt;br /&gt;
 # cd ~/.hermes/plugins/web-search-plus&lt;br /&gt;
 # FIRECRAWL_API_KEY=&amp;lt;font color = green&amp;gt;local-firecrawl&amp;lt;/font&amp;gt; python3 search.py --query &amp;quot;Hermes Agent latest release&amp;quot; --provider firecrawl --quality-report&lt;br /&gt;
&lt;br /&gt;
On lance ensuite Hermes :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
On lui demande d’effectuer une recherche avec Web Search Plus :&lt;br /&gt;
 Recherche la dernière version de Hermes Agent en utilisant web_search_plus et indique le fournisseur utilisé.&lt;br /&gt;
&lt;br /&gt;
On peut également demander un test explicite de DonSeTch :&lt;br /&gt;
 Recherche la documentation de Hermes Agent avec web_search_plus en imposant le fournisseur donsetch.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
&lt;br /&gt;
Si l’installation des dépendances Node est de nouveau proposée, répondre &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après une mise à jour. Si nécessaire, le réactiver :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
* DonSeTch&lt;br /&gt;
On met à jour DonSeTch vers la dernière version disponible :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
Sources :&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/USER_GUIDE.md Guide de Web Search Plus]&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/DONSETCH.md Intégration de DonSeTch]&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/NATIVE_BACKEND.md Backend natif Hermes]&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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=5136</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5136"/>
		<updated>2026-10-28T12:04:16Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Hermes Web Search Plus avec DonSeTch */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
=== Garder toutes les parties de réponse ouvertes (extension keep-expanded) ===&lt;br /&gt;
Par défaut, Hermes WebUI replie automatiquement les parties intermédiaires d&#039;une réponse (le texte que l&#039;IA écrit entre deux appels d&#039;outils) dès qu&#039;il y en a plus de 3 : un lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; apparaît pour les retrouver. Ce comportement est codé en dur (&amp;lt;code&amp;gt;INTERIM_COLLAPSE_THRESHOLD=3&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;static/messages.js&amp;lt;/code&amp;gt;) et ne propose aucune option. Les modèles qui produisent beaucoup de petites notes de progression (Qwen par exemple) le rendent vite pénible, car le bloc de code final peut se retrouver dans une partie repliée.&lt;br /&gt;
&lt;br /&gt;
Le WebUI supporte les extensions CSS (voir &amp;lt;code&amp;gt;docs/EXTENSIONS.md&amp;lt;/code&amp;gt; dans le dépôt). Voici une petite extension maison qui désactive ce repli.&lt;br /&gt;
&lt;br /&gt;
* Étape 1 — Créer le fichier CSS :&lt;br /&gt;
 # mkdir -p ~/.hermes/webui/extensions&lt;br /&gt;
 # vi ~/.hermes/webui/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
Y coller :&lt;br /&gt;
&lt;br /&gt;
 /* Extension hermes-webui : garder depliee chaque segment de reponse&lt;br /&gt;
    (desactive le repli automatique des notes intermediaires). */&lt;br /&gt;
 .interim-collapsed { display: revert !important; }&lt;br /&gt;
 .interim-collapse-toggle { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
* Étape 2 — Déclarer l&#039;extension au service : le service systemd lit déjà &amp;lt;code&amp;gt;EnvironmentFile=-/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (voir le service plus haut), on y ajoute donc deux lignes :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_DIR=/root/.hermes/webui/extensions&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
* Étape 3 — Redémarrer et vérifier :&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
 # systemctl is-active hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Puis recharger la page du WebUI dans le navigateur (F5) : toutes les parties des réponses restent ouvertes, et le lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; a disparu.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Redémarrer le service coupe brièvement la session WebUI en cours (les conversations sont sauvegardées, mais la réponse en cours de rédaction peut être perdue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retour en arrière :&#039;&#039;&#039; supprimer les deux lignes de &amp;lt;code&amp;gt;/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (ou le fichier CSS), puis relancer le service — le repli automatique revient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résistance aux mises à jour :&#039;&#039;&#039; cette configuration survit aux mises à jour normales (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/opt/hermes-webui&amp;lt;/code&amp;gt; puis redémarrage) :&lt;br /&gt;
* &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; est listé dans le &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; du projet : git ne le touche jamais ;&lt;br /&gt;
* le CSS vit dans &amp;lt;code&amp;gt;~/.hermes/webui/extensions/&amp;lt;/code&amp;gt;, hors du dépôt git — c&#039;est le répertoire officiellement recommandé pour les extensions.&lt;br /&gt;
&lt;br /&gt;
Seuls une réinstallation complète (suppression + re-clone) ou un changement de nom des classes &amp;lt;code&amp;gt;interim-collapsed&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;interim-collapse-toggle&amp;lt;/code&amp;gt; côté développeur pourraient casser l&#039;extension. Si le repli revient tout seul après une mise à jour, il suffit de vérifier ces sélecteurs dans le CSS.&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SearXNG et Firecrawl comme services locaux. Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe et active le plugin :&lt;br /&gt;
 # hermes plugins install web-search-plus --enable&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; si l’installation des dépendances Node est proposée :&lt;br /&gt;
 Install them into the plugin&#039;s own node_modules now? [y/N]: y&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si une autorisation est demandée :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
&lt;br /&gt;
On initialise le plugin avec le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # hermes web-search-plus setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
L’assistant propose ensuite d’activer Jev :&lt;br /&gt;
 Enable optional Jev (TypeSafe) for search-type overlay, extract quality, and language fill? [y/N]:&lt;br /&gt;
&lt;br /&gt;
Jev est un service extérieur optionnel utilisé pour améliorer la détection du type de recherche, l’évaluation des extractions et la détection de la langue. Il n’est pas nécessaire pour une configuration locale avec SearXNG, DonSeTch et Firecrawl. Répondre :&lt;br /&gt;
 n&lt;br /&gt;
&lt;br /&gt;
On renseigne l’adresse de l’instance SearXNG :&lt;br /&gt;
 # hermes config set SEARXNG_INSTANCE_URL &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l’autoriser explicitement :&lt;br /&gt;
 # hermes config set SEARXNG_ALLOW_PRIVATE 1&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; peut utiliser Keenable comme service de secours extérieur sans clé API. Pour l’autoriser :&lt;br /&gt;
 # hermes config set KEENABLE_ALLOW_PUBLIC 1&lt;br /&gt;
&lt;br /&gt;
Cette commande doit être omise pour conserver une configuration strictement locale.&lt;br /&gt;
&lt;br /&gt;
Pour que Web Search Plus considère Firecrawl comme configuré, une valeur doit être renseignée dans &amp;lt;code&amp;gt;FIRECRAWL_API_KEY&amp;lt;/code&amp;gt;. Si l’instance locale n’utilise aucune authentification, employer une valeur factice :&lt;br /&gt;
 # hermes config set FIRECRAWL_API_KEY &amp;lt;font color = blue&amp;gt;local-firecrawl&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
&lt;br /&gt;
On installe Chromium et Xvfb pour les fonctions nécessitant un navigateur :&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install chromium xvfb&lt;br /&gt;
&lt;br /&gt;
On vérifie le fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
On enregistre le chemin du binaire dans le profil Hermes :&lt;br /&gt;
 # hermes config set DONSETCH_BIN /root/.hermes/node/bin/donsetch&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite le routage automatique à SearXNG et Keenable. Pour utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l’extraction, on réinitialise la configuration avec le profil standard :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
&lt;br /&gt;
On désactive les fournisseurs inutilisés :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On définit les priorités de recherche et d’extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On autorise l’utilisation automatique de DonSeTch :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Si Keenable a été activé, on le définit comme fournisseur de secours :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
Cette commande doit également être omise pour conserver une configuration strictement locale.&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; ajoute l’autorisation d’utiliser le service public Keenable dans le fichier de routage du plugin. Ce réglage étant ignoré sous Hermes, il faut supprimer uniquement le bloc correspondant dans ce fichier.&lt;br /&gt;
&lt;br /&gt;
On édite le fichier de routage :&lt;br /&gt;
 # vi ~/.hermes/plugins/config.json&lt;br /&gt;
&lt;br /&gt;
On supprime uniquement le bloc suivant :&lt;br /&gt;
    &amp;quot;keenable&amp;quot;: {&lt;br /&gt;
        &amp;quot;allow_public&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
Il ne faut pas supprimer les autres occurrences de &amp;lt;code&amp;gt;keenable&amp;lt;/code&amp;gt;, notamment celles qui le définissent comme fournisseur de secours.&lt;br /&gt;
&lt;br /&gt;
On ajoute ou modifie ensuite l’objet &amp;lt;code&amp;gt;firecrawl&amp;lt;/code&amp;gt; situé à la racine du fichier :&lt;br /&gt;
   &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
     &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
     &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/scrape&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
L’option suivante n’est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
   &amp;quot;extract&amp;quot;: {&lt;br /&gt;
     &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;true&amp;lt;/font&amp;gt;&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
Les objets doivent être séparés par une virgule afin de conserver un fichier JSON valide. Les valeurs booléennes JSON s’écrivent en minuscules : &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Hermes peut réessayer automatiquement les appels Web qui échouent auprès de services externes anonymes comme Exa, Parallel, Firecrawl ou Keenable. Web Search Plus disposant déjà de son propre fournisseur de secours, on désactive ce second mécanisme :&lt;br /&gt;
 # hermes config set web.keyless_rescue false&lt;br /&gt;
&lt;br /&gt;
On vérifie la syntaxe du fichier de routage :&lt;br /&gt;
 # python3 -m json.tool ~/.hermes/plugins/config.json &amp;gt;/dev/null &amp;amp;&amp;amp; echo &amp;quot;JSON valide&amp;quot;&lt;br /&gt;
&lt;br /&gt;
On vérifie la configuration finale :&lt;br /&gt;
 # hermes web-search-plus status&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
Web Search Plus peut servir directement de backend aux outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active Web Search Plus pour la recherche et l’extraction :&lt;br /&gt;
 # hermes config set web.search_backend wsp&lt;br /&gt;
 # hermes config set web.extract_backend wsp&lt;br /&gt;
&lt;br /&gt;
Le backend &amp;lt;code&amp;gt;wsp&amp;lt;/code&amp;gt; ne doit être sélectionné pour l’extraction que si au moins un fournisseur compatible est disponible, comme DonSeTch ou Firecrawl.&lt;br /&gt;
&lt;br /&gt;
Les outils natifs nécessitent que le toolset &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; reste activé. Si celui-ci figure dans &amp;lt;code&amp;gt;agent.disabled_toolsets&amp;lt;/code&amp;gt;, il faut le retirer.&lt;br /&gt;
&lt;br /&gt;
On vérifie l’intégration :&lt;br /&gt;
 # hermes web-search-plus fastpath&lt;br /&gt;
 # hermes web-search-plus status&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
On teste directement le fournisseur Firecrawl :&lt;br /&gt;
 # cd ~/.hermes/plugins/web-search-plus&lt;br /&gt;
 # FIRECRAWL_API_KEY=local-firecrawl python3 search.py --query &amp;quot;Hermes Agent latest release&amp;quot; --provider firecrawl --quality-report&lt;br /&gt;
&lt;br /&gt;
On lance ensuite Hermes :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
On lui demande d’effectuer une recherche avec Web Search Plus :&lt;br /&gt;
 Recherche la dernière version de Hermes Agent en utilisant web_search_plus et indique le fournisseur utilisé.&lt;br /&gt;
&lt;br /&gt;
On peut également demander un test explicite de DonSeTch :&lt;br /&gt;
 Recherche la documentation de Hermes Agent avec web_search_plus en imposant le fournisseur donsetch.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
&lt;br /&gt;
Si l’installation des dépendances Node est de nouveau proposée, répondre &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après une mise à jour. Si nécessaire, le réactiver :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
* DonSeTch&lt;br /&gt;
On met à jour DonSeTch vers la dernière version disponible :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
Sources :&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/USER_GUIDE.md Guide de Web Search Plus]&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/DONSETCH.md Intégration de DonSeTch]&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/NATIVE_BACKEND.md Backend natif Hermes]&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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=5135</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5135"/>
		<updated>2026-10-28T11:56:41Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Hermes Web Search Plus avec DonSeTch */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
=== Garder toutes les parties de réponse ouvertes (extension keep-expanded) ===&lt;br /&gt;
Par défaut, Hermes WebUI replie automatiquement les parties intermédiaires d&#039;une réponse (le texte que l&#039;IA écrit entre deux appels d&#039;outils) dès qu&#039;il y en a plus de 3 : un lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; apparaît pour les retrouver. Ce comportement est codé en dur (&amp;lt;code&amp;gt;INTERIM_COLLAPSE_THRESHOLD=3&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;static/messages.js&amp;lt;/code&amp;gt;) et ne propose aucune option. Les modèles qui produisent beaucoup de petites notes de progression (Qwen par exemple) le rendent vite pénible, car le bloc de code final peut se retrouver dans une partie repliée.&lt;br /&gt;
&lt;br /&gt;
Le WebUI supporte les extensions CSS (voir &amp;lt;code&amp;gt;docs/EXTENSIONS.md&amp;lt;/code&amp;gt; dans le dépôt). Voici une petite extension maison qui désactive ce repli.&lt;br /&gt;
&lt;br /&gt;
* Étape 1 — Créer le fichier CSS :&lt;br /&gt;
 # mkdir -p ~/.hermes/webui/extensions&lt;br /&gt;
 # vi ~/.hermes/webui/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
Y coller :&lt;br /&gt;
&lt;br /&gt;
 /* Extension hermes-webui : garder depliee chaque segment de reponse&lt;br /&gt;
    (desactive le repli automatique des notes intermediaires). */&lt;br /&gt;
 .interim-collapsed { display: revert !important; }&lt;br /&gt;
 .interim-collapse-toggle { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
* Étape 2 — Déclarer l&#039;extension au service : le service systemd lit déjà &amp;lt;code&amp;gt;EnvironmentFile=-/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (voir le service plus haut), on y ajoute donc deux lignes :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_DIR=/root/.hermes/webui/extensions&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
* Étape 3 — Redémarrer et vérifier :&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
 # systemctl is-active hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Puis recharger la page du WebUI dans le navigateur (F5) : toutes les parties des réponses restent ouvertes, et le lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; a disparu.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Redémarrer le service coupe brièvement la session WebUI en cours (les conversations sont sauvegardées, mais la réponse en cours de rédaction peut être perdue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retour en arrière :&#039;&#039;&#039; supprimer les deux lignes de &amp;lt;code&amp;gt;/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (ou le fichier CSS), puis relancer le service — le repli automatique revient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résistance aux mises à jour :&#039;&#039;&#039; cette configuration survit aux mises à jour normales (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/opt/hermes-webui&amp;lt;/code&amp;gt; puis redémarrage) :&lt;br /&gt;
* &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; est listé dans le &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; du projet : git ne le touche jamais ;&lt;br /&gt;
* le CSS vit dans &amp;lt;code&amp;gt;~/.hermes/webui/extensions/&amp;lt;/code&amp;gt;, hors du dépôt git — c&#039;est le répertoire officiellement recommandé pour les extensions.&lt;br /&gt;
&lt;br /&gt;
Seuls une réinstallation complète (suppression + re-clone) ou un changement de nom des classes &amp;lt;code&amp;gt;interim-collapsed&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;interim-collapse-toggle&amp;lt;/code&amp;gt; côté développeur pourraient casser l&#039;extension. Si le repli revient tout seul après une mise à jour, il suffit de vérifier ces sélecteurs dans le CSS.&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SearXNG et Firecrawl comme services locaux. Il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe et active le plugin :&lt;br /&gt;
 # hermes plugins install web-search-plus --enable&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; si l’installation des dépendances Node est proposée :&lt;br /&gt;
 Install them into the plugin&#039;s own node_modules now? [y/N]: y&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si une autorisation est demandée :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
&lt;br /&gt;
On initialise le plugin avec le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # hermes web-search-plus setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
L’assistant propose ensuite d’activer Jev :&lt;br /&gt;
 Enable optional Jev (TypeSafe) for search-type overlay, extract quality, and language fill? [y/N]:&lt;br /&gt;
&lt;br /&gt;
Jev est un service extérieur optionnel utilisé pour améliorer la détection du type de recherche, l’évaluation des extractions et la détection de la langue. Il n’est pas nécessaire pour une configuration locale avec SearXNG, DonSeTch et Firecrawl. Répondre :&lt;br /&gt;
 n&lt;br /&gt;
&lt;br /&gt;
On renseigne l’adresse de l’instance SearXNG :&lt;br /&gt;
 # hermes config set SEARXNG_INSTANCE_URL &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l’autoriser explicitement :&lt;br /&gt;
 # hermes config set SEARXNG_ALLOW_PRIVATE 1&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; peut utiliser Keenable comme service de secours extérieur sans clé API. Pour l’autoriser :&lt;br /&gt;
 # hermes config set KEENABLE_ALLOW_PUBLIC 1&lt;br /&gt;
&lt;br /&gt;
Cette commande doit être omise pour conserver une configuration strictement locale.&lt;br /&gt;
&lt;br /&gt;
Pour que Web Search Plus considère Firecrawl comme configuré, une valeur doit être renseignée dans &amp;lt;code&amp;gt;FIRECRAWL_API_KEY&amp;lt;/code&amp;gt;. Si l’instance locale n’utilise aucune authentification, employer une valeur factice :&lt;br /&gt;
 # hermes config set FIRECRAWL_API_KEY &amp;lt;font color = blue&amp;gt;local-firecrawl&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour configurer l’instance Firecrawl, il faut modifier la configuration du plugin :&lt;br /&gt;
 # vi ~/.hermes/plugins/config.json&lt;br /&gt;
&lt;br /&gt;
Ajouter ou modifier l’objet &amp;lt;code&amp;gt;firecrawl&amp;lt;/code&amp;gt; situé à la racine du fichier :&lt;br /&gt;
   &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
     &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
     &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/scrape&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
L’option suivante n’est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
   &amp;quot;extract&amp;quot;: {&lt;br /&gt;
     &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;true&amp;lt;/font&amp;gt;&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
Les objets doivent être séparés par une virgule afin de conserver un fichier JSON valide. Les valeurs booléennes JSON s’écrivent en minuscules : &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On vérifie la configuration du plugin :&lt;br /&gt;
 # hermes web-search-plus status&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
 # hermes config set DONSETCH_BIN /root/.hermes/node/bin/donsetch&lt;br /&gt;
&lt;br /&gt;
On installe Chromium et Xvfb pour les fonctions nécessitant un navigateur :&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install chromium xvfb&lt;br /&gt;
&lt;br /&gt;
DonSeTch reste exclu du routage automatique par défaut. On l’autorise explicitement :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite le routage automatique à SearXNG et Keenable. Pour utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l’extraction, on réinitialise la configuration avec le profil standard :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
&lt;br /&gt;
On désactive les fournisseurs inutilisés :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On définit les priorités de recherche et d’extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On autorise de nouveau l’utilisation automatique de DonSeTch après la réinitialisation :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Si Keenable a été activé, on le définit comme fournisseur de secours :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; ajoute l’autorisation d’utiliser le service public Keenable dans le fichier de routage du plugin. Ce réglage étant ignoré sous Hermes, il faut supprimer uniquement le bloc correspondant dans ce fichier :&lt;br /&gt;
 # vi ~/.hermes/plugins/config.json&lt;br /&gt;
On supprime uniquement le bloc suivant :&lt;br /&gt;
    &amp;quot;keenable&amp;quot;: {&lt;br /&gt;
        &amp;quot;allow_public&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
Cette commande doit être omise pour conserver une configuration strictement locale.&lt;br /&gt;
&lt;br /&gt;
Hermes peut réessayer automatiquement la requête auprès de services externes anonymes : Exa, Parallel, Firecrawl ou Keenable. La désactiver avec :&lt;br /&gt;
 # hermes config set web.keyless_rescue false &lt;br /&gt;
&lt;br /&gt;
On vérifie la configuration finale :&lt;br /&gt;
 # hermes web-search-plus status&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
Web Search Plus peut servir directement de backend aux outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active Web Search Plus pour la recherche et l’extraction :&lt;br /&gt;
 # hermes config set web.search_backend wsp&lt;br /&gt;
 # hermes config set web.extract_backend wsp&lt;br /&gt;
&lt;br /&gt;
Le backend &amp;lt;code&amp;gt;wsp&amp;lt;/code&amp;gt; ne doit être sélectionné pour l’extraction que si au moins un fournisseur compatible est disponible, comme DonSeTch ou Firecrawl.&lt;br /&gt;
&lt;br /&gt;
Les outils natifs nécessitent que le toolset &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; reste activé. Si celui-ci figure dans &amp;lt;code&amp;gt;agent.disabled_toolsets&amp;lt;/code&amp;gt;, il faut le retirer.&lt;br /&gt;
&lt;br /&gt;
On vérifie l’intégration :&lt;br /&gt;
 # hermes web-search-plus fastpath&lt;br /&gt;
 # hermes web-search-plus status&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Test ===&lt;br /&gt;
On lance Hermes :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
On lui demande ensuite d’effectuer une recherche avec Web Search Plus :&lt;br /&gt;
 Recherche la dernière version de Hermes Agent en utilisant web_search_plus et indique le fournisseur utilisé.&lt;br /&gt;
&lt;br /&gt;
On peut également demander un test explicite de DonSeTch :&lt;br /&gt;
 Recherche la documentation de Hermes Agent avec web_search_plus en imposant le fournisseur donsetch.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
&lt;br /&gt;
Si l’installation des dépendances Node est de nouveau proposée, répondre &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après une mise à jour. Si nécessaire, le réactiver :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
* DonSeTch&lt;br /&gt;
On met à jour DonSeTch vers la dernière version disponible :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
Sources :&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/USER_GUIDE.md Guide de Web Search Plus]&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/DONSETCH.md Intégration de DonSeTch]&lt;br /&gt;
* [https://github.com/robbyczgw-cla/hermes-web-search-plus/blob/main/docs/NATIVE_BACKEND.md Backend natif Hermes]&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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=Firecrawl&amp;diff=5134</id>
		<title>Firecrawl</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Firecrawl&amp;diff=5134"/>
		<updated>2026-10-28T11:40:04Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Docker */&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;br /&gt;
&lt;br /&gt;
Le fichier Compose officiel de Firecrawl ne définit aucune politique de redémarrage, pour corriger durablement sans modifier le fichier officiel :&lt;br /&gt;
 # vi /opt/firecrawl/docker-compose.override.yaml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   api:&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
   playwright-service:&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
   redis:&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
   rabbitmq:&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
 &lt;br /&gt;
   nuq-postgres:&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/firecrawl&lt;br /&gt;
 # docker compose up -d&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5133</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5133"/>
		<updated>2026-10-28T10:55:28Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Provider Web pour les outils natifs Hermes */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
=== Garder toutes les parties de réponse ouvertes (extension keep-expanded) ===&lt;br /&gt;
Par défaut, Hermes WebUI replie automatiquement les parties intermédiaires d&#039;une réponse (le texte que l&#039;IA écrit entre deux appels d&#039;outils) dès qu&#039;il y en a plus de 3 : un lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; apparaît pour les retrouver. Ce comportement est codé en dur (&amp;lt;code&amp;gt;INTERIM_COLLAPSE_THRESHOLD=3&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;static/messages.js&amp;lt;/code&amp;gt;) et ne propose aucune option. Les modèles qui produisent beaucoup de petites notes de progression (Qwen par exemple) le rendent vite pénible, car le bloc de code final peut se retrouver dans une partie repliée.&lt;br /&gt;
&lt;br /&gt;
Le WebUI supporte les extensions CSS (voir &amp;lt;code&amp;gt;docs/EXTENSIONS.md&amp;lt;/code&amp;gt; dans le dépôt). Voici une petite extension maison qui désactive ce repli.&lt;br /&gt;
&lt;br /&gt;
* Étape 1 — Créer le fichier CSS :&lt;br /&gt;
 # mkdir -p ~/.hermes/webui/extensions&lt;br /&gt;
 # vi ~/.hermes/webui/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
Y coller :&lt;br /&gt;
&lt;br /&gt;
 /* Extension hermes-webui : garder depliee chaque segment de reponse&lt;br /&gt;
    (desactive le repli automatique des notes intermediaires). */&lt;br /&gt;
 .interim-collapsed { display: revert !important; }&lt;br /&gt;
 .interim-collapse-toggle { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
* Étape 2 — Déclarer l&#039;extension au service : le service systemd lit déjà &amp;lt;code&amp;gt;EnvironmentFile=-/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (voir le service plus haut), on y ajoute donc deux lignes :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_DIR=/root/.hermes/webui/extensions&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
* Étape 3 — Redémarrer et vérifier :&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
 # systemctl is-active hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Puis recharger la page du WebUI dans le navigateur (F5) : toutes les parties des réponses restent ouvertes, et le lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; a disparu.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Redémarrer le service coupe brièvement la session WebUI en cours (les conversations sont sauvegardées, mais la réponse en cours de rédaction peut être perdue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retour en arrière :&#039;&#039;&#039; supprimer les deux lignes de &amp;lt;code&amp;gt;/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (ou le fichier CSS), puis relancer le service — le repli automatique revient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résistance aux mises à jour :&#039;&#039;&#039; cette configuration survit aux mises à jour normales (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/opt/hermes-webui&amp;lt;/code&amp;gt; puis redémarrage) :&lt;br /&gt;
* &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; est listé dans le &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; du projet : git ne le touche jamais ;&lt;br /&gt;
* le CSS vit dans &amp;lt;code&amp;gt;~/.hermes/webui/extensions/&amp;lt;/code&amp;gt;, hors du dépôt git — c&#039;est le répertoire officiellement recommandé pour les extensions.&lt;br /&gt;
&lt;br /&gt;
Seuls une réinstallation complète (suppression + re-clone) ou un changement de nom des classes &amp;lt;code&amp;gt;interim-collapsed&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;interim-collapse-toggle&amp;lt;/code&amp;gt; côté développeur pourraient casser l&#039;extension. Si le repli revient tout seul après une mise à jour, il suffit de vérifier ces sélecteurs dans le CSS.&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SaerXNG et Firecrawl comme service secondaire afin de rester 100% local, il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # hermes plugins install web-search-plus&lt;br /&gt;
&lt;br /&gt;
On choisit le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; afin de ne pas dépendre de services extérieurs ou payants :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
Entrer l&#039;adresse de son instance SearXNG :&lt;br /&gt;
 SearXNG key (SEARXNG_INSTANCE_URL, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Il n&#039;est pas obligatoire de renseigner une clé à l&#039;invite suivante :&lt;br /&gt;
 Keenable key (KEENABLE_API_KEY, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l&#039;autoriser explicitement :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 SEARXNG_INSTANCE_URL=&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 SEARXNG_ALLOW_PRIVATE=1&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour configurer Firecrawl, si une clef API est nécessaire il faut la renseigner dans le .env :&lt;br /&gt;
&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_KEY=&amp;lt;font color = blue&amp;gt;FIRECRAWL_API_KEY&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 configurer l&#039;instance Firecrawl, il faut modifier la configuration du plugin :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/plugins/web-search-plus/config.py&lt;br /&gt;
Et remplacer :&lt;br /&gt;
     &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
         &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.firecrawl.dev/v2/search&amp;quot;,&lt;br /&gt;
         &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
         &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
         &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
     },&lt;br /&gt;
Par (exemple avec http simple) :&lt;br /&gt;
    &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
        &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
        &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_FIRECRAW&amp;lt;/font&amp;gt;L:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;/v2/scrape&amp;quot;,&lt;br /&gt;
        &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
        &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
        &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
    },&lt;br /&gt;
L&#039;option suivante n&#039;est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
     &amp;quot;extract&amp;quot;: { &lt;br /&gt;
         # Target URLs supplied to extract_plus are blocked when they resolve to&lt;br /&gt;
         # private/internal networks. Operators can opt in for trusted intranet use.&lt;br /&gt;
         &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;True&amp;lt;/font&amp;gt;,&lt;br /&gt;
     },&lt;br /&gt;
&lt;br /&gt;
On teste ensuite le fonctionnement du plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins/web-search-plus&lt;br /&gt;
 # python3 search.py --query &amp;quot;Hermes Agent latest release&amp;quot; --provider auto --quality-report&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
&lt;br /&gt;
On installe Chromium :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install chromium&lt;br /&gt;
&lt;br /&gt;
On vérifie son fonctionnement :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
On ajoute le chemin du binaire DonSeTch à l&#039;environnement d&#039;Hermes :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
 DONSETCH_BIN=/root/.hermes/node/bin/donsetch&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite par défaut le routage automatique à SearXNG et Keenable. On réinitialise donc la configuration afin de repasser sur le profil &amp;lt;code&amp;gt;standard&amp;lt;/code&amp;gt;, puis on autorise Web Search Plus à utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On désactive les autres fournisseurs :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On réapplique les priorités de recherche et d&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On définit Keenable comme fournisseur de secours. Il s&#039;agit d&#039;un fournisseur extérieur disposant d&#039;un accès gratuit limité sans clé API :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
On autorise l&#039;utilisation automatique de DonSeTch :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Pour vérifier la configuration :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour remplacer les outils web natifs (non recommandée et partiellement fonctionnelle)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* (Optionnel) On désactive les outils web natifs de Hermes pour utiliser uniquement ceux du plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Et on ajoute dans la section &amp;lt;code&amp;gt;agent:&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;web&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
&lt;br /&gt;
On édite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après la mise à jour si celui-ci obtient un verdict &amp;lt;code&amp;gt;dangerous&amp;lt;/code&amp;gt;. Si le plugin est de nouveau désactivé, le réactiver manuellement :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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=5132</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5132"/>
		<updated>2026-10-28T10:52:32Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Hermes Web Search Plus avec DonSeTch */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
=== Garder toutes les parties de réponse ouvertes (extension keep-expanded) ===&lt;br /&gt;
Par défaut, Hermes WebUI replie automatiquement les parties intermédiaires d&#039;une réponse (le texte que l&#039;IA écrit entre deux appels d&#039;outils) dès qu&#039;il y en a plus de 3 : un lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; apparaît pour les retrouver. Ce comportement est codé en dur (&amp;lt;code&amp;gt;INTERIM_COLLAPSE_THRESHOLD=3&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;static/messages.js&amp;lt;/code&amp;gt;) et ne propose aucune option. Les modèles qui produisent beaucoup de petites notes de progression (Qwen par exemple) le rendent vite pénible, car le bloc de code final peut se retrouver dans une partie repliée.&lt;br /&gt;
&lt;br /&gt;
Le WebUI supporte les extensions CSS (voir &amp;lt;code&amp;gt;docs/EXTENSIONS.md&amp;lt;/code&amp;gt; dans le dépôt). Voici une petite extension maison qui désactive ce repli.&lt;br /&gt;
&lt;br /&gt;
* Étape 1 — Créer le fichier CSS :&lt;br /&gt;
 # mkdir -p ~/.hermes/webui/extensions&lt;br /&gt;
 # vi ~/.hermes/webui/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
Y coller :&lt;br /&gt;
&lt;br /&gt;
 /* Extension hermes-webui : garder depliee chaque segment de reponse&lt;br /&gt;
    (desactive le repli automatique des notes intermediaires). */&lt;br /&gt;
 .interim-collapsed { display: revert !important; }&lt;br /&gt;
 .interim-collapse-toggle { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
* Étape 2 — Déclarer l&#039;extension au service : le service systemd lit déjà &amp;lt;code&amp;gt;EnvironmentFile=-/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (voir le service plus haut), on y ajoute donc deux lignes :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_DIR=/root/.hermes/webui/extensions&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
* Étape 3 — Redémarrer et vérifier :&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
 # systemctl is-active hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Puis recharger la page du WebUI dans le navigateur (F5) : toutes les parties des réponses restent ouvertes, et le lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; a disparu.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Redémarrer le service coupe brièvement la session WebUI en cours (les conversations sont sauvegardées, mais la réponse en cours de rédaction peut être perdue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retour en arrière :&#039;&#039;&#039; supprimer les deux lignes de &amp;lt;code&amp;gt;/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (ou le fichier CSS), puis relancer le service — le repli automatique revient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résistance aux mises à jour :&#039;&#039;&#039; cette configuration survit aux mises à jour normales (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/opt/hermes-webui&amp;lt;/code&amp;gt; puis redémarrage) :&lt;br /&gt;
* &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; est listé dans le &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; du projet : git ne le touche jamais ;&lt;br /&gt;
* le CSS vit dans &amp;lt;code&amp;gt;~/.hermes/webui/extensions/&amp;lt;/code&amp;gt;, hors du dépôt git — c&#039;est le répertoire officiellement recommandé pour les extensions.&lt;br /&gt;
&lt;br /&gt;
Seuls une réinstallation complète (suppression + re-clone) ou un changement de nom des classes &amp;lt;code&amp;gt;interim-collapsed&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;interim-collapse-toggle&amp;lt;/code&amp;gt; côté développeur pourraient casser l&#039;extension. Si le repli revient tout seul après une mise à jour, il suffit de vérifier ces sélecteurs dans le CSS.&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SaerXNG et Firecrawl comme service secondaire afin de rester 100% local, il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # hermes plugins install web-search-plus&lt;br /&gt;
&lt;br /&gt;
On choisit le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; afin de ne pas dépendre de services extérieurs ou payants :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
Entrer l&#039;adresse de son instance SearXNG :&lt;br /&gt;
 SearXNG key (SEARXNG_INSTANCE_URL, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Il n&#039;est pas obligatoire de renseigner une clé à l&#039;invite suivante :&lt;br /&gt;
 Keenable key (KEENABLE_API_KEY, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l&#039;autoriser explicitement :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 SEARXNG_INSTANCE_URL=&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 SEARXNG_ALLOW_PRIVATE=1&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour configurer Firecrawl, si une clef API est nécessaire il faut la renseigner dans le .env :&lt;br /&gt;
&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_KEY=&amp;lt;font color = blue&amp;gt;FIRECRAWL_API_KEY&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 configurer l&#039;instance Firecrawl, il faut modifier la configuration du plugin :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/plugins/web-search-plus/config.py&lt;br /&gt;
Et remplacer :&lt;br /&gt;
     &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
         &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.firecrawl.dev/v2/search&amp;quot;,&lt;br /&gt;
         &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
         &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
         &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
     },&lt;br /&gt;
Par (exemple avec http simple) :&lt;br /&gt;
    &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
        &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
        &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_FIRECRAW&amp;lt;/font&amp;gt;L:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;/v2/scrape&amp;quot;,&lt;br /&gt;
        &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
        &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
        &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
    },&lt;br /&gt;
L&#039;option suivante n&#039;est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
     &amp;quot;extract&amp;quot;: { &lt;br /&gt;
         # Target URLs supplied to extract_plus are blocked when they resolve to&lt;br /&gt;
         # private/internal networks. Operators can opt in for trusted intranet use.&lt;br /&gt;
         &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;True&amp;lt;/font&amp;gt;,&lt;br /&gt;
     },&lt;br /&gt;
&lt;br /&gt;
On teste ensuite le fonctionnement du plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins/web-search-plus&lt;br /&gt;
 # python3 search.py --query &amp;quot;Hermes Agent latest release&amp;quot; --provider auto --quality-report&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
&lt;br /&gt;
On installe Chromium :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install chromium&lt;br /&gt;
&lt;br /&gt;
On vérifie son fonctionnement :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
On ajoute le chemin du binaire DonSeTch à l&#039;environnement d&#039;Hermes :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
 DONSETCH_BIN=/root/.hermes/node/bin/donsetch&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite par défaut le routage automatique à SearXNG et Keenable. On réinitialise donc la configuration afin de repasser sur le profil &amp;lt;code&amp;gt;standard&amp;lt;/code&amp;gt;, puis on autorise Web Search Plus à utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On désactive les autres fournisseurs :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On réapplique les priorités de recherche et d&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On définit Keenable comme fournisseur de secours. Il s&#039;agit d&#039;un fournisseur extérieur disposant d&#039;un accès gratuit limité sans clé API :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
On autorise l&#039;utilisation automatique de DonSeTch :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Pour vérifier la configuration :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour remplacer les outils web natifs (non recommandée et partiellement fonctionnelle)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* (Optionnel) On désactive les outils web natifs de Hermes pour utiliser uniquement ceux du plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Et on ajoute dans la section &amp;lt;code&amp;gt;agent:&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;web&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour référence, aujourd&#039;hui intégrée nativement au plugin depuis la version 4.1.0&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Cette configuration permet de conserver les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes tout en remplaçant leur backend par Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Le modèle continue donc d&#039;utiliser les outils Web habituels de Hermes, mais les recherches et extractions sont transmises de manière transparente à Web Search Plus, qui applique ensuite sa propre configuration de routage vers DonSeTch, SearXNG, Firecrawl ou les autres providers activés.&lt;br /&gt;
&lt;br /&gt;
* Réactiver &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; dans la configuration d&#039;Hermes si nécessaire (supprimer &amp;lt;code&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;) :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Création d&#039;un provider Web pour remplacer de façon transparente les backends utilisés par les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes :&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/web/wsp&lt;br /&gt;
&lt;br /&gt;
On crée le fichier de métadonnées du plugin :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/plugin.yaml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 name: web-wsp&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 description: &amp;quot;Web Search Plus backend for Hermes native web_search/web_extract tools.&amp;quot;&lt;br /&gt;
 author: local&lt;br /&gt;
 kind: backend&lt;br /&gt;
 provides_web_providers:&lt;br /&gt;
   - wsp&lt;br /&gt;
&lt;br /&gt;
On crée ensuite le provider Web. Celui-ci sert d&#039;adaptateur entre les outils natifs de Hermes et Web Search Plus :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/__init__.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
import subprocess&lt;br /&gt;
import sys&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
from typing import Any, Dict, List&lt;br /&gt;
&lt;br /&gt;
from agent.web_search_provider import WebSearchProvider&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WSP_DIR = Path.home() / &amp;quot;.hermes&amp;quot; / &amp;quot;plugins&amp;quot; / &amp;quot;web-search-plus&amp;quot;&lt;br /&gt;
WSP_SEARCH = WSP_DIR / &amp;quot;search.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class WSPWebSearchProvider(WebSearchProvider):&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;wsp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def display_name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;Web Search Plus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def is_available(self) -&amp;gt; bool:&lt;br /&gt;
        return WSP_SEARCH.exists()&lt;br /&gt;
&lt;br /&gt;
    def supports_search(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def supports_extract(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def search(self, query: str, limit: int = 5) -&amp;gt; Dict[str, Any]:&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--query&amp;quot;,&lt;br /&gt;
            query,&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--max-results&amp;quot;,&lt;br /&gt;
            str(limit),&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus search failed: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: proc.stderr.strip() or &amp;quot;Web Search Plus search failed&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for i, item in enumerate(data.get(&amp;quot;results&amp;quot;, [])[:limit], start=1):&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;description&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;snippet&amp;quot;)&lt;br /&gt;
                        or item.get(&amp;quot;description&amp;quot;)&lt;br /&gt;
                        or &amp;quot;&amp;quot;&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;position&amp;quot;: i,&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return {&lt;br /&gt;
            &amp;quot;success&amp;quot;: True,&lt;br /&gt;
            &amp;quot;data&amp;quot;: {&lt;br /&gt;
                &amp;quot;web&amp;quot;: results,&lt;br /&gt;
            },&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    def extract(&lt;br /&gt;
        self,&lt;br /&gt;
        urls: List[str],&lt;br /&gt;
        format: str = &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        **kwargs: Any,&lt;br /&gt;
    ) -&amp;gt; List[Dict[str, Any]]:&lt;br /&gt;
&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--extract-urls&amp;quot;,&lt;br /&gt;
            *urls,&lt;br /&gt;
            &amp;quot;--format&amp;quot;,&lt;br /&gt;
            format or &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus extraction failed: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            error = (&lt;br /&gt;
                proc.stderr.strip()&lt;br /&gt;
                or &amp;quot;Web Search Plus extraction failed&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: error,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if data.get(&amp;quot;error&amp;quot;) and not data.get(&amp;quot;results&amp;quot;):&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: str(data[&amp;quot;error&amp;quot;]),&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for item in data.get(&amp;quot;results&amp;quot;, []):&lt;br /&gt;
            if not isinstance(item, dict):&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            content = str(&lt;br /&gt;
                item.get(&amp;quot;content&amp;quot;)&lt;br /&gt;
                or item.get(&amp;quot;markdown&amp;quot;)&lt;br /&gt;
                or &amp;quot;&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;content&amp;quot;: content,&lt;br /&gt;
                    &amp;quot;raw_content&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;raw_content&amp;quot;)&lt;br /&gt;
                        or content&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                        &amp;quot;provider&amp;quot;: data.get(&amp;quot;provider&amp;quot;),&lt;br /&gt;
                        &amp;quot;fetcher&amp;quot;: item.get(&amp;quot;fetcher&amp;quot;),&lt;br /&gt;
                        &amp;quot;status&amp;quot;: item.get(&amp;quot;status&amp;quot;),&lt;br /&gt;
                        &amp;quot;quality&amp;quot;: item.get(&amp;quot;quality&amp;quot;),&lt;br /&gt;
                        &amp;quot;lang&amp;quot;: item.get(&amp;quot;lang&amp;quot;),&lt;br /&gt;
                        &amp;quot;source_type&amp;quot;: item.get(&amp;quot;source_type&amp;quot;),&lt;br /&gt;
                        &amp;quot;page_type&amp;quot;: item.get(&amp;quot;page_type&amp;quot;),&lt;br /&gt;
                    },&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return results&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def register(ctx) -&amp;gt; None:&lt;br /&gt;
    ctx.register_web_search_provider(WSPWebSearchProvider())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le provider lance Web Search Plus dans un sous-processus distinct pour les recherches comme pour les extractions. Cela évite notamment les conflits entre les modules Python de Hermes et ceux de Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
On active ensuite le plugin :&lt;br /&gt;
 # hermes plugins enable web-wsp&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; à la demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
&lt;br /&gt;
Cette autorisation est nécessaire car le plugin fournit un backend susceptible d&#039;intercepter les appels effectués par les outils Web natifs de Hermes.&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&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;
&amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt; définit le backend Web général, tandis que &amp;lt;code&amp;gt;search_backend&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;extract_backend&amp;lt;/code&amp;gt; permettent de sélectionner explicitement des backends différents pour la recherche et l&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
Avec cette configuration, les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes restent inchangés pour le modèle, mais leurs appels sont transmis de façon transparente à Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On édite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après la mise à jour si celui-ci obtient un verdict &amp;lt;code&amp;gt;dangerous&amp;lt;/code&amp;gt;. Si le plugin est de nouveau désactivé, le réactiver manuellement :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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.cpp&amp;diff=5131</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5131"/>
		<updated>2026-10-28T10:31:57Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* LFM2.5-2.6B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM. &lt;br /&gt;
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev ccache&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Quelques dépendances :&lt;br /&gt;
 # apt install libnccl2 libnccl-dev&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&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 llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
== Utilisation d&#039;un LoRA ==&lt;br /&gt;
=== Installation des dépendances ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # python3 -m venv .venv-convert&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # pip install -U pip&lt;br /&gt;
 # pip install -e .&lt;br /&gt;
=== Conversion ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # python3 convert_lora_to_gguf.py --base-model-id &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt; --trust-remote-code --outtype f16 --outfile /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf /opt/lora/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;/&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Exemple avec &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt;, identifiant Hugging Face.&lt;br /&gt;
}}&lt;br /&gt;
=== Utilisation dans Llama.cpp ===&lt;br /&gt;
Ajouter simplement la ligne suivante :&lt;br /&gt;
 --lora /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf \&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.&lt;br /&gt;
** Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&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;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de configuration d’un modèle MTP + sm tensor ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type draft-mtp \&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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;
== Exemple de configuration d’un modèle MTP + sm tensor +ngram ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type &amp;lt;font color = blue&amp;gt;ngram-mod,&amp;lt;/font&amp;gt;draft-mtp \&lt;br /&gt;
   &amp;lt;font color = blue&amp;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 \&amp;lt;/font&amp;gt;&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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 = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
La combinaison &amp;lt;code&amp;gt;ngram-mod,draft-mtp&amp;lt;/code&amp;gt; permet d&#039;utiliser deux formes de génération spéculative complémentaires. Le MTP prédit quelques tokens à l&#039;avance grâce aux têtes intégrées au modèle, tandis que &amp;lt;code&amp;gt;ngram-mod&amp;lt;/code&amp;gt; recherche dans le contexte des séquences déjà rencontrées afin de proposer directement des blocs plus longs. Cela peut fortement accélérer les régénérations, les reprises de code, les structures répétitives ou les réponses proches d&#039;un texte déjà présent, sans ajouter de second modèle de draft.&lt;br /&gt;
&lt;br /&gt;
Les paramètres &amp;lt;code&amp;gt;--spec-ngram-mod-n-match 24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--spec-ngram-mod-n-min 12&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;--spec-ngram-mod-n-max 48&amp;lt;/code&amp;gt; définissent respectivement la longueur minimale de correspondance recherchée, puis la taille minimale et maximale des blocs proposés. Avec ces valeurs, le mécanisme reste assez sélectif tout en pouvant accélérer nettement les passages répétitifs. Sur du contenu entièrement nouveau, le gain est généralement faible et le MTP reste le principal mécanisme spéculatif.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modèles Embedding ==&lt;br /&gt;
=== [https://huggingface.co/SuperPauly/harrier-oss-v1-0.6b-gguf microsoft/harrier-oss-v1-0.6b] ===&lt;br /&gt;
 # hf download SuperPauly/harrier-oss-v1-0.6b-gguf --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/harrier-oss-v1-0.6b/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-embedding.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Embedding&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/harrier-oss-v1-0.6b/Q8_0/harrier-oss-v1-0.6B-Q8_0.gguf \&lt;br /&gt;
   --alias harrier-oss-v1-0.6b \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --embedding \&lt;br /&gt;
   --pooling last \&lt;br /&gt;
   -c 4096 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 1024 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;--sleep-idle-seconds 300&amp;lt;/font&amp;gt;&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 4096&amp;lt;/code&amp;gt; : définit le contexte maximal accepté par le serveur, ici 4096 tokens. Cette valeur est recommandée pour un serveur d’embedding utilisé avec RAGFlow, car les documents sont normalement découpés en chunks plus petits, souvent autour de 1024 à 2048 tokens. Ce modèle peut monter jusqu’à &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt;, au prix d’une consommation mémoire beaucoup plus élevée.&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;
Pour les modèles d’embedding, les paramètres &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; doivent être configurés avec la même valeur. Par exemple : &amp;lt;code&amp;gt;-b 1024 -ub 1024&amp;lt;/code&amp;gt;. Si &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; est supérieur à &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;llama-server&amp;lt;/code&amp;gt; peut ramener automatiquement les deux valeurs à celle de &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; afin d’éviter une erreur d’assertion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Rerank ==&lt;br /&gt;
=== [https://huggingface.co/Felladrin/gguf-Q8_0-bge-reranker-v2-m3 bge-reranker-v2-m3-Q8_0-GGUF] ===&lt;br /&gt;
 # hf download Felladrin/gguf-Q8_0-bge-reranker-v2-m3 --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/bge-reranker-v2-m3/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/bge-reranker-v2-m3/Q8_0/bge-reranker-v2-m3-q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== [https://huggingface.co/jinaai/jina-reranker-v3.5-GGUF jinaai/jina-reranker-v3.5-GGUF] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
&amp;lt;code&amp;gt;Jina Reranker 3.5&amp;lt;/code&amp;gt; n&#039;est pas encore pris en charge par la version officielle de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;. Ce modèle nécessite un mode encodeur non causal ainsi qu&#039;une option spécifique &amp;lt;code&amp;gt;--output-token-ids&amp;lt;/code&amp;gt;, actuellement absents de la branche officielle. Une pull request est ouverte pour ajouter cette prise en charge : &amp;lt;code&amp;gt;ggml-org/llama.cpp#26286&amp;lt;/code&amp;gt; En attendant son intégration, il faut utiliser le fork de &amp;lt;code&amp;gt;littlewine/llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download jinaai/jina-reranker-v3.5-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/jina-reranker-v3.5/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/jina-reranker-v3.5/Q8_0/jina-reranker-v3.5-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 16384&amp;lt;/code&amp;gt; : valeur confortable pour un serveur de rerank utilisé avec RAGFlow. Le modèle &amp;lt;code&amp;gt;jina-reranker-v3.5&amp;lt;/code&amp;gt; reçoit la requête utilisateur ainsi qu’une liste de chunks candidats à comparer, ce qui nécessite davantage de contexte qu’un modèle d’embedding traitant les chunks individuellement. Il prend théoriquement en charge jusqu’à &amp;lt;code&amp;gt;131072&amp;lt;/code&amp;gt; tokens de contexte, mais une telle valeur augmente fortement la consommation de VRAM ou de RAM et n’est généralement pas utile pour un serveur local. Une fenêtre de &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens offre donc une marge importante pour les requêtes et les chunks habituellement envoyés par RAGFlow.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Img2txt ==&lt;br /&gt;
=== [https://huggingface.co/mradermacher/LightOnOCR-2-1B-GGUF mradermacher/LightOnOCR-2-1B-GGUF] ===&lt;br /&gt;
 # hf download mradermacher/LightOnOCR-2-1B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-f16*.gguf&amp;quot; --local-dir /opt/models/LightOnOCR-2-1B/Q8_0&lt;br /&gt;
 # rm -f /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-Q8_0.gguf&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-img2txt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Img2txt LightOnOCR-2-1B&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.Q8_0.gguf \&lt;br /&gt;
   --mmproj /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-f16.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8082&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 8192&amp;lt;/code&amp;gt; : valeur recommandée pour un serveur Img2txt/OCR utilisé avec LightOnOCR-2-1B. Le modèle supporte jusqu’à &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens, mais &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; offre déjà une marge confortable pour traiter une image ou une page scannée avec beaucoup de texte.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles auxiliaires ==&lt;br /&gt;
=== Vision ===&lt;br /&gt;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Thinking-GGUF/tree/main Qwen3-VL-4B-Thinking] (Dépôt officiel) ====&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Thinking-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Thinking-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/Qwen3VL-4B-Thinking-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/mmproj-Qwen3VL-4B-Thinking-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 1.0 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 0.0 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct-GGUF  Qwen3-VL-4B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Instruct-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 5,25gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/Qwen3VL-4B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/mmproj-Qwen3VL-4B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct-GGUF  Qwen3-VL-2B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-2B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 3gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/Qwen3VL-2B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
=== Généraliste ===&lt;br /&gt;
==== [https://huggingface.co/LiquidAI/LFM3-1.7B-GGUF LFM3-1.7B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
LFM3-1.7B est un modèle compact, rapide et multilingue, spécialement post-entraîné pour les usages agentiques, les appels d’outils et les sorties structurées. LiquidAI fournit notamment des exemples de configuration pour Hermes Agent, OpenClaw et Pi. Malgré ses 1,7 milliard de paramètres, il surpasse généralement LFM2.5-2.6B tout en consommant moins de mémoire. Il prend nativement en charge une fenêtre de contexte allant jusqu’à 262144 tokens, ce qui le rend particulièrement intéressant pour les tâches auxiliaires nécessitant un contexte important, comme la compression de mémoire de Hermes ou de Mnémosyne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download LiquidAI/LFM3-1.7B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/LFM3-1.7B-GGUF/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM3-1.7B-GGUF/Q8_0/LFM3-1.7B-Q8_0.gguf \&lt;br /&gt;
   --alias LFM3-1.7B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 262144 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --repeat-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
==== [https://huggingface.co/bartowski/LiquidAI_LFM2.5-2.6B-GGUF LFM2.5-2.6B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
FM2.5-2.6B est un petit modèle performant et multilingue, particulièrement adapté aux usages agentiques et aux appels d&#039;outils. LiquidAI fournit notamment des exemples de configuration pour Hermes, OpenClaw et Pi. Il prend nativement en charge une fenêtre de contexte allant jusqu&#039;à 131072 tokens, ce qui est particulièrement intéressant pour certaines tâches auxiliaires nécessitant un contexte important, comme le module de compression de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # hf download bartowski/LiquidAI_LFM2.5-2.6B-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L/LiquidAI_LFM2.5-2.6B-Q6_K_L.gguf \&lt;br /&gt;
   --alias LiquidAI_LFM2.5-2.6B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 131072 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --repeat-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
== Modèles de langage spécialisés en traduction ==&lt;br /&gt;
=== [[https://huggingface.co/unsloth/Hy-MT2-7B-GGUF Hy-MT2-7B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-7B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-7B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-7B/UD-Q6_K_XL/Hy-MT2-7B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [[https://huggingface.co/unsloth/Hy-MT2-1.8B-GGUF Hy-MT2-1.8B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-1.8B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL/Hy-MT2-1.8B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/mradermacher/Hunyuan-MT-7B-GGUF Hunyuan-MT-7B] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Modèle ancien et dépassé. De plus, sa licence interdit son utilisation dans de nombreux territoires, dont l&#039;Union européenne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download mradermacher/Hunyuan-MT-7B-GGUF --include &amp;quot;*Q6*.gguf&amp;quot; --local-dir /opt/models/Hunyuan-MT-7B/Q6_K&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hunyuan-MT-7B/Q6_K/Hunyuan-MT-7B.Q6_K.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&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 2048 \&lt;br /&gt;
     -ub 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat] pour test traduction intelligente rapide ===&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*Q4*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 bf16 \&lt;br /&gt;
     -ctv bf16 \&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;
     --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-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q4_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;
 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;
=== [https://huggingface.co/unsloth/gemma-4-31B-it-qat-GGUF gemma-4-31B-it-qat] pour test traduction intelligente (2x 12 Go de VRAM) ===&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;MTP/mtp-gemma-4-31B-it-Q8_0.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 512 \&lt;br /&gt;
     -ub 512 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --spec-type ngram-mod,ngram-map-k4v,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-ngram-map-k4v-size-n 12 \&lt;br /&gt;
     --spec-ngram-map-k4v-size-m 48 \&lt;br /&gt;
     --spec-ngram-map-k4v-min-hits 1 \&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;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5130</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5130"/>
		<updated>2026-10-28T10:31:45Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* LFM3-1.7B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM. &lt;br /&gt;
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev ccache&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Quelques dépendances :&lt;br /&gt;
 # apt install libnccl2 libnccl-dev&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&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 llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
== Utilisation d&#039;un LoRA ==&lt;br /&gt;
=== Installation des dépendances ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # python3 -m venv .venv-convert&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # pip install -U pip&lt;br /&gt;
 # pip install -e .&lt;br /&gt;
=== Conversion ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # python3 convert_lora_to_gguf.py --base-model-id &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt; --trust-remote-code --outtype f16 --outfile /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf /opt/lora/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;/&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Exemple avec &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt;, identifiant Hugging Face.&lt;br /&gt;
}}&lt;br /&gt;
=== Utilisation dans Llama.cpp ===&lt;br /&gt;
Ajouter simplement la ligne suivante :&lt;br /&gt;
 --lora /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf \&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.&lt;br /&gt;
** Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&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;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de configuration d’un modèle MTP + sm tensor ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type draft-mtp \&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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;
== Exemple de configuration d’un modèle MTP + sm tensor +ngram ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type &amp;lt;font color = blue&amp;gt;ngram-mod,&amp;lt;/font&amp;gt;draft-mtp \&lt;br /&gt;
   &amp;lt;font color = blue&amp;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 \&amp;lt;/font&amp;gt;&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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 = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
La combinaison &amp;lt;code&amp;gt;ngram-mod,draft-mtp&amp;lt;/code&amp;gt; permet d&#039;utiliser deux formes de génération spéculative complémentaires. Le MTP prédit quelques tokens à l&#039;avance grâce aux têtes intégrées au modèle, tandis que &amp;lt;code&amp;gt;ngram-mod&amp;lt;/code&amp;gt; recherche dans le contexte des séquences déjà rencontrées afin de proposer directement des blocs plus longs. Cela peut fortement accélérer les régénérations, les reprises de code, les structures répétitives ou les réponses proches d&#039;un texte déjà présent, sans ajouter de second modèle de draft.&lt;br /&gt;
&lt;br /&gt;
Les paramètres &amp;lt;code&amp;gt;--spec-ngram-mod-n-match 24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--spec-ngram-mod-n-min 12&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;--spec-ngram-mod-n-max 48&amp;lt;/code&amp;gt; définissent respectivement la longueur minimale de correspondance recherchée, puis la taille minimale et maximale des blocs proposés. Avec ces valeurs, le mécanisme reste assez sélectif tout en pouvant accélérer nettement les passages répétitifs. Sur du contenu entièrement nouveau, le gain est généralement faible et le MTP reste le principal mécanisme spéculatif.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modèles Embedding ==&lt;br /&gt;
=== [https://huggingface.co/SuperPauly/harrier-oss-v1-0.6b-gguf microsoft/harrier-oss-v1-0.6b] ===&lt;br /&gt;
 # hf download SuperPauly/harrier-oss-v1-0.6b-gguf --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/harrier-oss-v1-0.6b/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-embedding.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Embedding&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/harrier-oss-v1-0.6b/Q8_0/harrier-oss-v1-0.6B-Q8_0.gguf \&lt;br /&gt;
   --alias harrier-oss-v1-0.6b \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --embedding \&lt;br /&gt;
   --pooling last \&lt;br /&gt;
   -c 4096 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 1024 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;--sleep-idle-seconds 300&amp;lt;/font&amp;gt;&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 4096&amp;lt;/code&amp;gt; : définit le contexte maximal accepté par le serveur, ici 4096 tokens. Cette valeur est recommandée pour un serveur d’embedding utilisé avec RAGFlow, car les documents sont normalement découpés en chunks plus petits, souvent autour de 1024 à 2048 tokens. Ce modèle peut monter jusqu’à &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt;, au prix d’une consommation mémoire beaucoup plus élevée.&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;
Pour les modèles d’embedding, les paramètres &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; doivent être configurés avec la même valeur. Par exemple : &amp;lt;code&amp;gt;-b 1024 -ub 1024&amp;lt;/code&amp;gt;. Si &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; est supérieur à &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;llama-server&amp;lt;/code&amp;gt; peut ramener automatiquement les deux valeurs à celle de &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; afin d’éviter une erreur d’assertion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Rerank ==&lt;br /&gt;
=== [https://huggingface.co/Felladrin/gguf-Q8_0-bge-reranker-v2-m3 bge-reranker-v2-m3-Q8_0-GGUF] ===&lt;br /&gt;
 # hf download Felladrin/gguf-Q8_0-bge-reranker-v2-m3 --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/bge-reranker-v2-m3/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/bge-reranker-v2-m3/Q8_0/bge-reranker-v2-m3-q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== [https://huggingface.co/jinaai/jina-reranker-v3.5-GGUF jinaai/jina-reranker-v3.5-GGUF] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
&amp;lt;code&amp;gt;Jina Reranker 3.5&amp;lt;/code&amp;gt; n&#039;est pas encore pris en charge par la version officielle de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;. Ce modèle nécessite un mode encodeur non causal ainsi qu&#039;une option spécifique &amp;lt;code&amp;gt;--output-token-ids&amp;lt;/code&amp;gt;, actuellement absents de la branche officielle. Une pull request est ouverte pour ajouter cette prise en charge : &amp;lt;code&amp;gt;ggml-org/llama.cpp#26286&amp;lt;/code&amp;gt; En attendant son intégration, il faut utiliser le fork de &amp;lt;code&amp;gt;littlewine/llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download jinaai/jina-reranker-v3.5-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/jina-reranker-v3.5/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/jina-reranker-v3.5/Q8_0/jina-reranker-v3.5-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 16384&amp;lt;/code&amp;gt; : valeur confortable pour un serveur de rerank utilisé avec RAGFlow. Le modèle &amp;lt;code&amp;gt;jina-reranker-v3.5&amp;lt;/code&amp;gt; reçoit la requête utilisateur ainsi qu’une liste de chunks candidats à comparer, ce qui nécessite davantage de contexte qu’un modèle d’embedding traitant les chunks individuellement. Il prend théoriquement en charge jusqu’à &amp;lt;code&amp;gt;131072&amp;lt;/code&amp;gt; tokens de contexte, mais une telle valeur augmente fortement la consommation de VRAM ou de RAM et n’est généralement pas utile pour un serveur local. Une fenêtre de &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens offre donc une marge importante pour les requêtes et les chunks habituellement envoyés par RAGFlow.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Img2txt ==&lt;br /&gt;
=== [https://huggingface.co/mradermacher/LightOnOCR-2-1B-GGUF mradermacher/LightOnOCR-2-1B-GGUF] ===&lt;br /&gt;
 # hf download mradermacher/LightOnOCR-2-1B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-f16*.gguf&amp;quot; --local-dir /opt/models/LightOnOCR-2-1B/Q8_0&lt;br /&gt;
 # rm -f /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-Q8_0.gguf&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-img2txt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Img2txt LightOnOCR-2-1B&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.Q8_0.gguf \&lt;br /&gt;
   --mmproj /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-f16.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8082&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 8192&amp;lt;/code&amp;gt; : valeur recommandée pour un serveur Img2txt/OCR utilisé avec LightOnOCR-2-1B. Le modèle supporte jusqu’à &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens, mais &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; offre déjà une marge confortable pour traiter une image ou une page scannée avec beaucoup de texte.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles auxiliaires ==&lt;br /&gt;
=== Vision ===&lt;br /&gt;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Thinking-GGUF/tree/main Qwen3-VL-4B-Thinking] (Dépôt officiel) ====&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Thinking-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Thinking-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/Qwen3VL-4B-Thinking-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/mmproj-Qwen3VL-4B-Thinking-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 1.0 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 0.0 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct-GGUF  Qwen3-VL-4B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Instruct-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 5,25gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/Qwen3VL-4B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/mmproj-Qwen3VL-4B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct-GGUF  Qwen3-VL-2B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-2B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 3gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/Qwen3VL-2B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
=== Généraliste ===&lt;br /&gt;
==== [https://huggingface.co/LiquidAI/LFM3-1.7B-GGUF LFM3-1.7B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
LFM3-1.7B est un modèle compact, rapide et multilingue, spécialement post-entraîné pour les usages agentiques, les appels d’outils et les sorties structurées. LiquidAI fournit notamment des exemples de configuration pour Hermes Agent, OpenClaw et Pi. Malgré ses 1,7 milliard de paramètres, il surpasse généralement LFM2.5-2.6B tout en consommant moins de mémoire. Il prend nativement en charge une fenêtre de contexte allant jusqu’à 262144 tokens, ce qui le rend particulièrement intéressant pour les tâches auxiliaires nécessitant un contexte important, comme la compression de mémoire de Hermes ou de Mnémosyne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download LiquidAI/LFM3-1.7B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/LFM3-1.7B-GGUF/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM3-1.7B-GGUF/Q8_0/LFM3-1.7B-Q8_0.gguf \&lt;br /&gt;
   --alias LFM3-1.7B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 262144 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --repeat-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
==== [https://huggingface.co/bartowski/LiquidAI_LFM2.5-2.6B-GGUF LFM2.5-2.6B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
FM2.5-2.6B est un petit modèle performant et multilingue, particulièrement adapté aux usages agentiques et aux appels d&#039;outils. LiquidAI fournit notamment des exemples de configuration pour Hermes, OpenClaw et Pi. Il prend nativement en charge une fenêtre de contexte allant jusqu&#039;à 131072 tokens, ce qui est particulièrement intéressant pour certaines tâches auxiliaires nécessitant un contexte important, comme le module de compression de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # hf download bartowski/LiquidAI_LFM2.5-2.6B-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L/LiquidAI_LFM2.5-2.6B-Q6_K_L.gguf \&lt;br /&gt;
   --alias LiquidAI_LFM2.5-2.6B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 131072 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --repeat-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
== Modèles de langage spécialisés en traduction ==&lt;br /&gt;
=== [[https://huggingface.co/unsloth/Hy-MT2-7B-GGUF Hy-MT2-7B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-7B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-7B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-7B/UD-Q6_K_XL/Hy-MT2-7B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [[https://huggingface.co/unsloth/Hy-MT2-1.8B-GGUF Hy-MT2-1.8B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-1.8B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL/Hy-MT2-1.8B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/mradermacher/Hunyuan-MT-7B-GGUF Hunyuan-MT-7B] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Modèle ancien et dépassé. De plus, sa licence interdit son utilisation dans de nombreux territoires, dont l&#039;Union européenne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download mradermacher/Hunyuan-MT-7B-GGUF --include &amp;quot;*Q6*.gguf&amp;quot; --local-dir /opt/models/Hunyuan-MT-7B/Q6_K&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hunyuan-MT-7B/Q6_K/Hunyuan-MT-7B.Q6_K.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&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 2048 \&lt;br /&gt;
     -ub 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat] pour test traduction intelligente rapide ===&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*Q4*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 bf16 \&lt;br /&gt;
     -ctv bf16 \&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;
     --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-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q4_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;
 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;
=== [https://huggingface.co/unsloth/gemma-4-31B-it-qat-GGUF gemma-4-31B-it-qat] pour test traduction intelligente (2x 12 Go de VRAM) ===&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;MTP/mtp-gemma-4-31B-it-Q8_0.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 512 \&lt;br /&gt;
     -ub 512 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --spec-type ngram-mod,ngram-map-k4v,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-ngram-map-k4v-size-n 12 \&lt;br /&gt;
     --spec-ngram-map-k4v-size-m 48 \&lt;br /&gt;
     --spec-ngram-map-k4v-min-hits 1 \&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;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5129</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5129"/>
		<updated>2026-10-28T10:29:07Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* LFM2.5-2.6B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM. &lt;br /&gt;
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev ccache&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Quelques dépendances :&lt;br /&gt;
 # apt install libnccl2 libnccl-dev&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&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 llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
== Utilisation d&#039;un LoRA ==&lt;br /&gt;
=== Installation des dépendances ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # python3 -m venv .venv-convert&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # pip install -U pip&lt;br /&gt;
 # pip install -e .&lt;br /&gt;
=== Conversion ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # python3 convert_lora_to_gguf.py --base-model-id &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt; --trust-remote-code --outtype f16 --outfile /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf /opt/lora/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;/&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Exemple avec &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt;, identifiant Hugging Face.&lt;br /&gt;
}}&lt;br /&gt;
=== Utilisation dans Llama.cpp ===&lt;br /&gt;
Ajouter simplement la ligne suivante :&lt;br /&gt;
 --lora /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf \&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.&lt;br /&gt;
** Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&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;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de configuration d’un modèle MTP + sm tensor ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type draft-mtp \&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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;
== Exemple de configuration d’un modèle MTP + sm tensor +ngram ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type &amp;lt;font color = blue&amp;gt;ngram-mod,&amp;lt;/font&amp;gt;draft-mtp \&lt;br /&gt;
   &amp;lt;font color = blue&amp;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 \&amp;lt;/font&amp;gt;&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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 = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
La combinaison &amp;lt;code&amp;gt;ngram-mod,draft-mtp&amp;lt;/code&amp;gt; permet d&#039;utiliser deux formes de génération spéculative complémentaires. Le MTP prédit quelques tokens à l&#039;avance grâce aux têtes intégrées au modèle, tandis que &amp;lt;code&amp;gt;ngram-mod&amp;lt;/code&amp;gt; recherche dans le contexte des séquences déjà rencontrées afin de proposer directement des blocs plus longs. Cela peut fortement accélérer les régénérations, les reprises de code, les structures répétitives ou les réponses proches d&#039;un texte déjà présent, sans ajouter de second modèle de draft.&lt;br /&gt;
&lt;br /&gt;
Les paramètres &amp;lt;code&amp;gt;--spec-ngram-mod-n-match 24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--spec-ngram-mod-n-min 12&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;--spec-ngram-mod-n-max 48&amp;lt;/code&amp;gt; définissent respectivement la longueur minimale de correspondance recherchée, puis la taille minimale et maximale des blocs proposés. Avec ces valeurs, le mécanisme reste assez sélectif tout en pouvant accélérer nettement les passages répétitifs. Sur du contenu entièrement nouveau, le gain est généralement faible et le MTP reste le principal mécanisme spéculatif.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modèles Embedding ==&lt;br /&gt;
=== [https://huggingface.co/SuperPauly/harrier-oss-v1-0.6b-gguf microsoft/harrier-oss-v1-0.6b] ===&lt;br /&gt;
 # hf download SuperPauly/harrier-oss-v1-0.6b-gguf --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/harrier-oss-v1-0.6b/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-embedding.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Embedding&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/harrier-oss-v1-0.6b/Q8_0/harrier-oss-v1-0.6B-Q8_0.gguf \&lt;br /&gt;
   --alias harrier-oss-v1-0.6b \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --embedding \&lt;br /&gt;
   --pooling last \&lt;br /&gt;
   -c 4096 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 1024 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;--sleep-idle-seconds 300&amp;lt;/font&amp;gt;&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 4096&amp;lt;/code&amp;gt; : définit le contexte maximal accepté par le serveur, ici 4096 tokens. Cette valeur est recommandée pour un serveur d’embedding utilisé avec RAGFlow, car les documents sont normalement découpés en chunks plus petits, souvent autour de 1024 à 2048 tokens. Ce modèle peut monter jusqu’à &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt;, au prix d’une consommation mémoire beaucoup plus élevée.&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;
Pour les modèles d’embedding, les paramètres &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; doivent être configurés avec la même valeur. Par exemple : &amp;lt;code&amp;gt;-b 1024 -ub 1024&amp;lt;/code&amp;gt;. Si &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; est supérieur à &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;llama-server&amp;lt;/code&amp;gt; peut ramener automatiquement les deux valeurs à celle de &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; afin d’éviter une erreur d’assertion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Rerank ==&lt;br /&gt;
=== [https://huggingface.co/Felladrin/gguf-Q8_0-bge-reranker-v2-m3 bge-reranker-v2-m3-Q8_0-GGUF] ===&lt;br /&gt;
 # hf download Felladrin/gguf-Q8_0-bge-reranker-v2-m3 --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/bge-reranker-v2-m3/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/bge-reranker-v2-m3/Q8_0/bge-reranker-v2-m3-q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== [https://huggingface.co/jinaai/jina-reranker-v3.5-GGUF jinaai/jina-reranker-v3.5-GGUF] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
&amp;lt;code&amp;gt;Jina Reranker 3.5&amp;lt;/code&amp;gt; n&#039;est pas encore pris en charge par la version officielle de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;. Ce modèle nécessite un mode encodeur non causal ainsi qu&#039;une option spécifique &amp;lt;code&amp;gt;--output-token-ids&amp;lt;/code&amp;gt;, actuellement absents de la branche officielle. Une pull request est ouverte pour ajouter cette prise en charge : &amp;lt;code&amp;gt;ggml-org/llama.cpp#26286&amp;lt;/code&amp;gt; En attendant son intégration, il faut utiliser le fork de &amp;lt;code&amp;gt;littlewine/llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download jinaai/jina-reranker-v3.5-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/jina-reranker-v3.5/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/jina-reranker-v3.5/Q8_0/jina-reranker-v3.5-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 16384&amp;lt;/code&amp;gt; : valeur confortable pour un serveur de rerank utilisé avec RAGFlow. Le modèle &amp;lt;code&amp;gt;jina-reranker-v3.5&amp;lt;/code&amp;gt; reçoit la requête utilisateur ainsi qu’une liste de chunks candidats à comparer, ce qui nécessite davantage de contexte qu’un modèle d’embedding traitant les chunks individuellement. Il prend théoriquement en charge jusqu’à &amp;lt;code&amp;gt;131072&amp;lt;/code&amp;gt; tokens de contexte, mais une telle valeur augmente fortement la consommation de VRAM ou de RAM et n’est généralement pas utile pour un serveur local. Une fenêtre de &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens offre donc une marge importante pour les requêtes et les chunks habituellement envoyés par RAGFlow.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Img2txt ==&lt;br /&gt;
=== [https://huggingface.co/mradermacher/LightOnOCR-2-1B-GGUF mradermacher/LightOnOCR-2-1B-GGUF] ===&lt;br /&gt;
 # hf download mradermacher/LightOnOCR-2-1B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-f16*.gguf&amp;quot; --local-dir /opt/models/LightOnOCR-2-1B/Q8_0&lt;br /&gt;
 # rm -f /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-Q8_0.gguf&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-img2txt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Img2txt LightOnOCR-2-1B&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.Q8_0.gguf \&lt;br /&gt;
   --mmproj /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-f16.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8082&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 8192&amp;lt;/code&amp;gt; : valeur recommandée pour un serveur Img2txt/OCR utilisé avec LightOnOCR-2-1B. Le modèle supporte jusqu’à &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens, mais &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; offre déjà une marge confortable pour traiter une image ou une page scannée avec beaucoup de texte.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles auxiliaires ==&lt;br /&gt;
=== Vision ===&lt;br /&gt;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Thinking-GGUF/tree/main Qwen3-VL-4B-Thinking] (Dépôt officiel) ====&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Thinking-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Thinking-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/Qwen3VL-4B-Thinking-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/mmproj-Qwen3VL-4B-Thinking-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 1.0 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 0.0 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct-GGUF  Qwen3-VL-4B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Instruct-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 5,25gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/Qwen3VL-4B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/mmproj-Qwen3VL-4B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct-GGUF  Qwen3-VL-2B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-2B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 3gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/Qwen3VL-2B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
=== Généraliste ===&lt;br /&gt;
==== [https://huggingface.co/LiquidAI/LFM3-1.7B-GGUF LFM3-1.7B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
LFM3-1.7B est un modèle compact, rapide et multilingue, spécialement post-entraîné pour les usages agentiques, les appels d’outils et les sorties structurées. LiquidAI fournit notamment des exemples de configuration pour Hermes Agent, OpenClaw et Pi. Malgré ses 1,7 milliard de paramètres, il surpasse généralement LFM2.5-2.6B tout en consommant moins de mémoire. Il prend nativement en charge une fenêtre de contexte allant jusqu’à 262144 tokens, ce qui le rend particulièrement intéressant pour les tâches auxiliaires nécessitant un contexte important, comme la compression de mémoire de Hermes ou de Mnémosyne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download LiquidAI/LFM3-1.7B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/LFM3-1.7B-GGUF/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM3-1.7B-GGUF/Q8_0/LFM3-1.7B-Q8_0.gguf \&lt;br /&gt;
   --alias LFM3-1.7B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 262144 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --repeat-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
==== [https://huggingface.co/bartowski/LiquidAI_LFM2.5-2.6B-GGUF LFM2.5-2.6B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
FM2.5-2.6B est un petit modèle performant et multilingue, particulièrement adapté aux usages agentiques et aux appels d&#039;outils. LiquidAI fournit notamment des exemples de configuration pour Hermes, OpenClaw et Pi. Il prend nativement en charge une fenêtre de contexte allant jusqu&#039;à 131072 tokens, ce qui est particulièrement intéressant pour certaines tâches auxiliaires nécessitant un contexte important, comme le module de compression de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # hf download bartowski/LiquidAI_LFM2.5-2.6B-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L/LiquidAI_LFM2.5-2.6B-Q6_K_L.gguf \&lt;br /&gt;
   --alias LiquidAI_LFM2.5-2.6B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 131072 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --repeat-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
== Modèles de langage spécialisés en traduction ==&lt;br /&gt;
=== [[https://huggingface.co/unsloth/Hy-MT2-7B-GGUF Hy-MT2-7B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-7B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-7B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-7B/UD-Q6_K_XL/Hy-MT2-7B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [[https://huggingface.co/unsloth/Hy-MT2-1.8B-GGUF Hy-MT2-1.8B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-1.8B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL/Hy-MT2-1.8B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/mradermacher/Hunyuan-MT-7B-GGUF Hunyuan-MT-7B] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Modèle ancien et dépassé. De plus, sa licence interdit son utilisation dans de nombreux territoires, dont l&#039;Union européenne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download mradermacher/Hunyuan-MT-7B-GGUF --include &amp;quot;*Q6*.gguf&amp;quot; --local-dir /opt/models/Hunyuan-MT-7B/Q6_K&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hunyuan-MT-7B/Q6_K/Hunyuan-MT-7B.Q6_K.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&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 2048 \&lt;br /&gt;
     -ub 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat] pour test traduction intelligente rapide ===&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*Q4*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 bf16 \&lt;br /&gt;
     -ctv bf16 \&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;
     --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-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q4_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;
 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;
=== [https://huggingface.co/unsloth/gemma-4-31B-it-qat-GGUF gemma-4-31B-it-qat] pour test traduction intelligente (2x 12 Go de VRAM) ===&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;MTP/mtp-gemma-4-31B-it-Q8_0.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 512 \&lt;br /&gt;
     -ub 512 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --spec-type ngram-mod,ngram-map-k4v,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-ngram-map-k4v-size-n 12 \&lt;br /&gt;
     --spec-ngram-map-k4v-size-m 48 \&lt;br /&gt;
     --spec-ngram-map-k4v-min-hits 1 \&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;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5128</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5128"/>
		<updated>2026-10-28T10:28:59Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* LFM3-1.7B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM. &lt;br /&gt;
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev ccache&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Quelques dépendances :&lt;br /&gt;
 # apt install libnccl2 libnccl-dev&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&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 llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
== Utilisation d&#039;un LoRA ==&lt;br /&gt;
=== Installation des dépendances ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # python3 -m venv .venv-convert&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # pip install -U pip&lt;br /&gt;
 # pip install -e .&lt;br /&gt;
=== Conversion ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # python3 convert_lora_to_gguf.py --base-model-id &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt; --trust-remote-code --outtype f16 --outfile /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf /opt/lora/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;/&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Exemple avec &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt;, identifiant Hugging Face.&lt;br /&gt;
}}&lt;br /&gt;
=== Utilisation dans Llama.cpp ===&lt;br /&gt;
Ajouter simplement la ligne suivante :&lt;br /&gt;
 --lora /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf \&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.&lt;br /&gt;
** Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&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;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de configuration d’un modèle MTP + sm tensor ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type draft-mtp \&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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;
== Exemple de configuration d’un modèle MTP + sm tensor +ngram ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type &amp;lt;font color = blue&amp;gt;ngram-mod,&amp;lt;/font&amp;gt;draft-mtp \&lt;br /&gt;
   &amp;lt;font color = blue&amp;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 \&amp;lt;/font&amp;gt;&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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 = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
La combinaison &amp;lt;code&amp;gt;ngram-mod,draft-mtp&amp;lt;/code&amp;gt; permet d&#039;utiliser deux formes de génération spéculative complémentaires. Le MTP prédit quelques tokens à l&#039;avance grâce aux têtes intégrées au modèle, tandis que &amp;lt;code&amp;gt;ngram-mod&amp;lt;/code&amp;gt; recherche dans le contexte des séquences déjà rencontrées afin de proposer directement des blocs plus longs. Cela peut fortement accélérer les régénérations, les reprises de code, les structures répétitives ou les réponses proches d&#039;un texte déjà présent, sans ajouter de second modèle de draft.&lt;br /&gt;
&lt;br /&gt;
Les paramètres &amp;lt;code&amp;gt;--spec-ngram-mod-n-match 24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--spec-ngram-mod-n-min 12&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;--spec-ngram-mod-n-max 48&amp;lt;/code&amp;gt; définissent respectivement la longueur minimale de correspondance recherchée, puis la taille minimale et maximale des blocs proposés. Avec ces valeurs, le mécanisme reste assez sélectif tout en pouvant accélérer nettement les passages répétitifs. Sur du contenu entièrement nouveau, le gain est généralement faible et le MTP reste le principal mécanisme spéculatif.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modèles Embedding ==&lt;br /&gt;
=== [https://huggingface.co/SuperPauly/harrier-oss-v1-0.6b-gguf microsoft/harrier-oss-v1-0.6b] ===&lt;br /&gt;
 # hf download SuperPauly/harrier-oss-v1-0.6b-gguf --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/harrier-oss-v1-0.6b/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-embedding.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Embedding&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/harrier-oss-v1-0.6b/Q8_0/harrier-oss-v1-0.6B-Q8_0.gguf \&lt;br /&gt;
   --alias harrier-oss-v1-0.6b \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --embedding \&lt;br /&gt;
   --pooling last \&lt;br /&gt;
   -c 4096 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 1024 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;--sleep-idle-seconds 300&amp;lt;/font&amp;gt;&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 4096&amp;lt;/code&amp;gt; : définit le contexte maximal accepté par le serveur, ici 4096 tokens. Cette valeur est recommandée pour un serveur d’embedding utilisé avec RAGFlow, car les documents sont normalement découpés en chunks plus petits, souvent autour de 1024 à 2048 tokens. Ce modèle peut monter jusqu’à &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt;, au prix d’une consommation mémoire beaucoup plus élevée.&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;
Pour les modèles d’embedding, les paramètres &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; doivent être configurés avec la même valeur. Par exemple : &amp;lt;code&amp;gt;-b 1024 -ub 1024&amp;lt;/code&amp;gt;. Si &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; est supérieur à &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;llama-server&amp;lt;/code&amp;gt; peut ramener automatiquement les deux valeurs à celle de &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; afin d’éviter une erreur d’assertion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Rerank ==&lt;br /&gt;
=== [https://huggingface.co/Felladrin/gguf-Q8_0-bge-reranker-v2-m3 bge-reranker-v2-m3-Q8_0-GGUF] ===&lt;br /&gt;
 # hf download Felladrin/gguf-Q8_0-bge-reranker-v2-m3 --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/bge-reranker-v2-m3/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/bge-reranker-v2-m3/Q8_0/bge-reranker-v2-m3-q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== [https://huggingface.co/jinaai/jina-reranker-v3.5-GGUF jinaai/jina-reranker-v3.5-GGUF] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
&amp;lt;code&amp;gt;Jina Reranker 3.5&amp;lt;/code&amp;gt; n&#039;est pas encore pris en charge par la version officielle de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;. Ce modèle nécessite un mode encodeur non causal ainsi qu&#039;une option spécifique &amp;lt;code&amp;gt;--output-token-ids&amp;lt;/code&amp;gt;, actuellement absents de la branche officielle. Une pull request est ouverte pour ajouter cette prise en charge : &amp;lt;code&amp;gt;ggml-org/llama.cpp#26286&amp;lt;/code&amp;gt; En attendant son intégration, il faut utiliser le fork de &amp;lt;code&amp;gt;littlewine/llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download jinaai/jina-reranker-v3.5-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/jina-reranker-v3.5/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/jina-reranker-v3.5/Q8_0/jina-reranker-v3.5-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 16384&amp;lt;/code&amp;gt; : valeur confortable pour un serveur de rerank utilisé avec RAGFlow. Le modèle &amp;lt;code&amp;gt;jina-reranker-v3.5&amp;lt;/code&amp;gt; reçoit la requête utilisateur ainsi qu’une liste de chunks candidats à comparer, ce qui nécessite davantage de contexte qu’un modèle d’embedding traitant les chunks individuellement. Il prend théoriquement en charge jusqu’à &amp;lt;code&amp;gt;131072&amp;lt;/code&amp;gt; tokens de contexte, mais une telle valeur augmente fortement la consommation de VRAM ou de RAM et n’est généralement pas utile pour un serveur local. Une fenêtre de &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens offre donc une marge importante pour les requêtes et les chunks habituellement envoyés par RAGFlow.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Img2txt ==&lt;br /&gt;
=== [https://huggingface.co/mradermacher/LightOnOCR-2-1B-GGUF mradermacher/LightOnOCR-2-1B-GGUF] ===&lt;br /&gt;
 # hf download mradermacher/LightOnOCR-2-1B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-f16*.gguf&amp;quot; --local-dir /opt/models/LightOnOCR-2-1B/Q8_0&lt;br /&gt;
 # rm -f /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-Q8_0.gguf&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-img2txt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Img2txt LightOnOCR-2-1B&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.Q8_0.gguf \&lt;br /&gt;
   --mmproj /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-f16.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8082&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 8192&amp;lt;/code&amp;gt; : valeur recommandée pour un serveur Img2txt/OCR utilisé avec LightOnOCR-2-1B. Le modèle supporte jusqu’à &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens, mais &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; offre déjà une marge confortable pour traiter une image ou une page scannée avec beaucoup de texte.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles auxiliaires ==&lt;br /&gt;
=== Vision ===&lt;br /&gt;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Thinking-GGUF/tree/main Qwen3-VL-4B-Thinking] (Dépôt officiel) ====&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Thinking-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Thinking-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/Qwen3VL-4B-Thinking-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/mmproj-Qwen3VL-4B-Thinking-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 1.0 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 0.0 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct-GGUF  Qwen3-VL-4B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Instruct-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 5,25gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/Qwen3VL-4B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/mmproj-Qwen3VL-4B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct-GGUF  Qwen3-VL-2B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-2B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 3gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/Qwen3VL-2B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
=== Généraliste ===&lt;br /&gt;
==== [https://huggingface.co/LiquidAI/LFM3-1.7B-GGUF LFM3-1.7B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
LFM3-1.7B est un modèle compact, rapide et multilingue, spécialement post-entraîné pour les usages agentiques, les appels d’outils et les sorties structurées. LiquidAI fournit notamment des exemples de configuration pour Hermes Agent, OpenClaw et Pi. Malgré ses 1,7 milliard de paramètres, il surpasse généralement LFM2.5-2.6B tout en consommant moins de mémoire. Il prend nativement en charge une fenêtre de contexte allant jusqu’à 262144 tokens, ce qui le rend particulièrement intéressant pour les tâches auxiliaires nécessitant un contexte important, comme la compression de mémoire de Hermes ou de Mnémosyne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download LiquidAI/LFM3-1.7B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/LFM3-1.7B-GGUF/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM3-1.7B-GGUF/Q8_0/LFM3-1.7B-Q8_0.gguf \&lt;br /&gt;
   --alias LFM3-1.7B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 262144 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --repeat-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
==== [https://huggingface.co/bartowski/LiquidAI_LFM2.5-2.6B-GGUF LFM2.5-2.6B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
FM2.5-2.6B est un petit modèle performant et multilingue, particulièrement adapté aux usages agentiques et aux appels d&#039;outils. LiquidAI fournit notamment des exemples de configuration pour Hermes, OpenClaw et Pi. Il prend nativement en charge une fenêtre de contexte allant jusqu&#039;à 131072 tokens, ce qui est particulièrement intéressant pour certaines tâches auxiliaires nécessitant un contexte important, comme le module de compression de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # hf download bartowski/LiquidAI_LFM2.5-2.6B-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L/LiquidAI_LFM2.5-2.6B-Q6_K_L.gguf \&lt;br /&gt;
   --alias LiquidAI_LFM2.5-2.6B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 131072 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
== Modèles de langage spécialisés en traduction ==&lt;br /&gt;
=== [[https://huggingface.co/unsloth/Hy-MT2-7B-GGUF Hy-MT2-7B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-7B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-7B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-7B/UD-Q6_K_XL/Hy-MT2-7B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [[https://huggingface.co/unsloth/Hy-MT2-1.8B-GGUF Hy-MT2-1.8B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-1.8B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL/Hy-MT2-1.8B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/mradermacher/Hunyuan-MT-7B-GGUF Hunyuan-MT-7B] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Modèle ancien et dépassé. De plus, sa licence interdit son utilisation dans de nombreux territoires, dont l&#039;Union européenne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download mradermacher/Hunyuan-MT-7B-GGUF --include &amp;quot;*Q6*.gguf&amp;quot; --local-dir /opt/models/Hunyuan-MT-7B/Q6_K&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hunyuan-MT-7B/Q6_K/Hunyuan-MT-7B.Q6_K.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&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 2048 \&lt;br /&gt;
     -ub 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat] pour test traduction intelligente rapide ===&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*Q4*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 bf16 \&lt;br /&gt;
     -ctv bf16 \&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;
     --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-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q4_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;
 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;
=== [https://huggingface.co/unsloth/gemma-4-31B-it-qat-GGUF gemma-4-31B-it-qat] pour test traduction intelligente (2x 12 Go de VRAM) ===&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;MTP/mtp-gemma-4-31B-it-Q8_0.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 512 \&lt;br /&gt;
     -ub 512 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --spec-type ngram-mod,ngram-map-k4v,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-ngram-map-k4v-size-n 12 \&lt;br /&gt;
     --spec-ngram-map-k4v-size-m 48 \&lt;br /&gt;
     --spec-ngram-map-k4v-min-hits 1 \&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;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5127</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5127"/>
		<updated>2026-10-28T10:25:54Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Généraliste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM. &lt;br /&gt;
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev ccache&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Quelques dépendances :&lt;br /&gt;
 # apt install libnccl2 libnccl-dev&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&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 llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
== Utilisation d&#039;un LoRA ==&lt;br /&gt;
=== Installation des dépendances ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # python3 -m venv .venv-convert&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # pip install -U pip&lt;br /&gt;
 # pip install -e .&lt;br /&gt;
=== Conversion ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # python3 convert_lora_to_gguf.py --base-model-id &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt; --trust-remote-code --outtype f16 --outfile /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf /opt/lora/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;/&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Exemple avec &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt;, identifiant Hugging Face.&lt;br /&gt;
}}&lt;br /&gt;
=== Utilisation dans Llama.cpp ===&lt;br /&gt;
Ajouter simplement la ligne suivante :&lt;br /&gt;
 --lora /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf \&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.&lt;br /&gt;
** Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&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;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de configuration d’un modèle MTP + sm tensor ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type draft-mtp \&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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;
== Exemple de configuration d’un modèle MTP + sm tensor +ngram ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type &amp;lt;font color = blue&amp;gt;ngram-mod,&amp;lt;/font&amp;gt;draft-mtp \&lt;br /&gt;
   &amp;lt;font color = blue&amp;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 \&amp;lt;/font&amp;gt;&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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 = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
La combinaison &amp;lt;code&amp;gt;ngram-mod,draft-mtp&amp;lt;/code&amp;gt; permet d&#039;utiliser deux formes de génération spéculative complémentaires. Le MTP prédit quelques tokens à l&#039;avance grâce aux têtes intégrées au modèle, tandis que &amp;lt;code&amp;gt;ngram-mod&amp;lt;/code&amp;gt; recherche dans le contexte des séquences déjà rencontrées afin de proposer directement des blocs plus longs. Cela peut fortement accélérer les régénérations, les reprises de code, les structures répétitives ou les réponses proches d&#039;un texte déjà présent, sans ajouter de second modèle de draft.&lt;br /&gt;
&lt;br /&gt;
Les paramètres &amp;lt;code&amp;gt;--spec-ngram-mod-n-match 24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--spec-ngram-mod-n-min 12&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;--spec-ngram-mod-n-max 48&amp;lt;/code&amp;gt; définissent respectivement la longueur minimale de correspondance recherchée, puis la taille minimale et maximale des blocs proposés. Avec ces valeurs, le mécanisme reste assez sélectif tout en pouvant accélérer nettement les passages répétitifs. Sur du contenu entièrement nouveau, le gain est généralement faible et le MTP reste le principal mécanisme spéculatif.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modèles Embedding ==&lt;br /&gt;
=== [https://huggingface.co/SuperPauly/harrier-oss-v1-0.6b-gguf microsoft/harrier-oss-v1-0.6b] ===&lt;br /&gt;
 # hf download SuperPauly/harrier-oss-v1-0.6b-gguf --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/harrier-oss-v1-0.6b/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-embedding.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Embedding&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/harrier-oss-v1-0.6b/Q8_0/harrier-oss-v1-0.6B-Q8_0.gguf \&lt;br /&gt;
   --alias harrier-oss-v1-0.6b \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --embedding \&lt;br /&gt;
   --pooling last \&lt;br /&gt;
   -c 4096 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 1024 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;--sleep-idle-seconds 300&amp;lt;/font&amp;gt;&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 4096&amp;lt;/code&amp;gt; : définit le contexte maximal accepté par le serveur, ici 4096 tokens. Cette valeur est recommandée pour un serveur d’embedding utilisé avec RAGFlow, car les documents sont normalement découpés en chunks plus petits, souvent autour de 1024 à 2048 tokens. Ce modèle peut monter jusqu’à &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt;, au prix d’une consommation mémoire beaucoup plus élevée.&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;
Pour les modèles d’embedding, les paramètres &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; doivent être configurés avec la même valeur. Par exemple : &amp;lt;code&amp;gt;-b 1024 -ub 1024&amp;lt;/code&amp;gt;. Si &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; est supérieur à &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;llama-server&amp;lt;/code&amp;gt; peut ramener automatiquement les deux valeurs à celle de &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; afin d’éviter une erreur d’assertion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Rerank ==&lt;br /&gt;
=== [https://huggingface.co/Felladrin/gguf-Q8_0-bge-reranker-v2-m3 bge-reranker-v2-m3-Q8_0-GGUF] ===&lt;br /&gt;
 # hf download Felladrin/gguf-Q8_0-bge-reranker-v2-m3 --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/bge-reranker-v2-m3/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/bge-reranker-v2-m3/Q8_0/bge-reranker-v2-m3-q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== [https://huggingface.co/jinaai/jina-reranker-v3.5-GGUF jinaai/jina-reranker-v3.5-GGUF] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
&amp;lt;code&amp;gt;Jina Reranker 3.5&amp;lt;/code&amp;gt; n&#039;est pas encore pris en charge par la version officielle de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;. Ce modèle nécessite un mode encodeur non causal ainsi qu&#039;une option spécifique &amp;lt;code&amp;gt;--output-token-ids&amp;lt;/code&amp;gt;, actuellement absents de la branche officielle. Une pull request est ouverte pour ajouter cette prise en charge : &amp;lt;code&amp;gt;ggml-org/llama.cpp#26286&amp;lt;/code&amp;gt; En attendant son intégration, il faut utiliser le fork de &amp;lt;code&amp;gt;littlewine/llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download jinaai/jina-reranker-v3.5-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/jina-reranker-v3.5/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/jina-reranker-v3.5/Q8_0/jina-reranker-v3.5-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 16384&amp;lt;/code&amp;gt; : valeur confortable pour un serveur de rerank utilisé avec RAGFlow. Le modèle &amp;lt;code&amp;gt;jina-reranker-v3.5&amp;lt;/code&amp;gt; reçoit la requête utilisateur ainsi qu’une liste de chunks candidats à comparer, ce qui nécessite davantage de contexte qu’un modèle d’embedding traitant les chunks individuellement. Il prend théoriquement en charge jusqu’à &amp;lt;code&amp;gt;131072&amp;lt;/code&amp;gt; tokens de contexte, mais une telle valeur augmente fortement la consommation de VRAM ou de RAM et n’est généralement pas utile pour un serveur local. Une fenêtre de &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens offre donc une marge importante pour les requêtes et les chunks habituellement envoyés par RAGFlow.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Img2txt ==&lt;br /&gt;
=== [https://huggingface.co/mradermacher/LightOnOCR-2-1B-GGUF mradermacher/LightOnOCR-2-1B-GGUF] ===&lt;br /&gt;
 # hf download mradermacher/LightOnOCR-2-1B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-f16*.gguf&amp;quot; --local-dir /opt/models/LightOnOCR-2-1B/Q8_0&lt;br /&gt;
 # rm -f /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-Q8_0.gguf&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-img2txt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Img2txt LightOnOCR-2-1B&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.Q8_0.gguf \&lt;br /&gt;
   --mmproj /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-f16.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8082&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 8192&amp;lt;/code&amp;gt; : valeur recommandée pour un serveur Img2txt/OCR utilisé avec LightOnOCR-2-1B. Le modèle supporte jusqu’à &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens, mais &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; offre déjà une marge confortable pour traiter une image ou une page scannée avec beaucoup de texte.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles auxiliaires ==&lt;br /&gt;
=== Vision ===&lt;br /&gt;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Thinking-GGUF/tree/main Qwen3-VL-4B-Thinking] (Dépôt officiel) ====&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Thinking-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Thinking-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/Qwen3VL-4B-Thinking-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/mmproj-Qwen3VL-4B-Thinking-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 1.0 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 0.0 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct-GGUF  Qwen3-VL-4B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Instruct-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 5,25gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/Qwen3VL-4B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/mmproj-Qwen3VL-4B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct-GGUF  Qwen3-VL-2B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-2B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 3gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/Qwen3VL-2B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
=== Généraliste ===&lt;br /&gt;
==== [https://huggingface.co/LiquidAI/LFM3-1.7B-GGUF LFM3-1.7B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
LFM3-1.7B est un modèle compact, rapide et multilingue, spécialement post-entraîné pour les usages agentiques, les appels d’outils et les sorties structurées. LiquidAI fournit notamment des exemples de configuration pour Hermes Agent, OpenClaw et Pi. Malgré ses 1,7 milliard de paramètres, il surpasse généralement LFM2.5-2.6B tout en consommant moins de mémoire. Il prend nativement en charge une fenêtre de contexte allant jusqu’à 262144 tokens, ce qui le rend particulièrement intéressant pour les tâches auxiliaires nécessitant un contexte important, comme la compression de mémoire de Hermes ou de Mnémosyne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download LiquidAI/LFM3-1.7B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/LFM3-1.7B-GGUF/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM3-1.7B-GGUF/Q8_0/LFM3-1.7B-Q8_0.gguf \&lt;br /&gt;
   --alias LFM3-1.7B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 262144 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
==== [https://huggingface.co/bartowski/LiquidAI_LFM2.5-2.6B-GGUF LFM2.5-2.6B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
FM2.5-2.6B est un petit modèle performant et multilingue, particulièrement adapté aux usages agentiques et aux appels d&#039;outils. LiquidAI fournit notamment des exemples de configuration pour Hermes, OpenClaw et Pi. Il prend nativement en charge une fenêtre de contexte allant jusqu&#039;à 131072 tokens, ce qui est particulièrement intéressant pour certaines tâches auxiliaires nécessitant un contexte important, comme le module de compression de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # hf download bartowski/LiquidAI_LFM2.5-2.6B-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L/LiquidAI_LFM2.5-2.6B-Q6_K_L.gguf \&lt;br /&gt;
   --alias LiquidAI_LFM2.5-2.6B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 131072 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
== Modèles de langage spécialisés en traduction ==&lt;br /&gt;
=== [[https://huggingface.co/unsloth/Hy-MT2-7B-GGUF Hy-MT2-7B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-7B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-7B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-7B/UD-Q6_K_XL/Hy-MT2-7B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [[https://huggingface.co/unsloth/Hy-MT2-1.8B-GGUF Hy-MT2-1.8B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-1.8B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL/Hy-MT2-1.8B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/mradermacher/Hunyuan-MT-7B-GGUF Hunyuan-MT-7B] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Modèle ancien et dépassé. De plus, sa licence interdit son utilisation dans de nombreux territoires, dont l&#039;Union européenne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download mradermacher/Hunyuan-MT-7B-GGUF --include &amp;quot;*Q6*.gguf&amp;quot; --local-dir /opt/models/Hunyuan-MT-7B/Q6_K&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hunyuan-MT-7B/Q6_K/Hunyuan-MT-7B.Q6_K.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&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 2048 \&lt;br /&gt;
     -ub 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat] pour test traduction intelligente rapide ===&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*Q4*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 bf16 \&lt;br /&gt;
     -ctv bf16 \&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;
     --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-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q4_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;
 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;
=== [https://huggingface.co/unsloth/gemma-4-31B-it-qat-GGUF gemma-4-31B-it-qat] pour test traduction intelligente (2x 12 Go de VRAM) ===&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;MTP/mtp-gemma-4-31B-it-Q8_0.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 512 \&lt;br /&gt;
     -ub 512 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --spec-type ngram-mod,ngram-map-k4v,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-ngram-map-k4v-size-n 12 \&lt;br /&gt;
     --spec-ngram-map-k4v-size-m 48 \&lt;br /&gt;
     --spec-ngram-map-k4v-min-hits 1 \&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;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5126</id>
		<title>Strata</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5126"/>
		<updated>2026-10-28T09:38:23Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Privilégier la qualité de Qwen à la vitesse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
 # sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
 # sudo apt install git build-essential&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # sudo git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/Niko1221/Strata.git&lt;br /&gt;
 # cd Strata&lt;br /&gt;
 # sudo ./setup.sh&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
 # cd /opt/Strata&lt;br /&gt;
 # sudo ./update.sh&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Après avoir laissé le moteur effectuer son réglage automatique, il est possible d’ajuster manuellement certains paramètres :&lt;br /&gt;
&lt;br /&gt;
 # sudo vi /opt/Strata/&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;strata-unsloth-ud-iq4_xs&amp;lt;/font&amp;gt;.json&lt;br /&gt;
&lt;br /&gt;
=== Table N-GRAM en RAM ===&lt;br /&gt;
&lt;br /&gt;
Pour charger la table N-GRAM en RAM plutôt que depuis le stockage, ajouter les paramètres suivants dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--ple-io&amp;quot;,&lt;br /&gt;
 &amp;quot;ram&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option est particulièrement intéressante lorsque le modèle est stocké sur un SSD SATA ou un support relativement lent.&lt;br /&gt;
&lt;br /&gt;
=== fit_max_tokens ===&lt;br /&gt;
&lt;br /&gt;
Pour éviter qu’une requête soit refusée lorsque la somme du prompt et du nombre maximal de tokens de sortie dépasse la taille du contexte, ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;fit_max_tokens&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
Strata réduit alors automatiquement &amp;lt;code&amp;gt;max_tokens&amp;lt;/code&amp;gt; afin que la réponse tienne dans le contexte restant.&lt;br /&gt;
&lt;br /&gt;
=== Nombre de workers CPU ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--pool-workers&amp;lt;/code&amp;gt; permet de définir le nombre de workers utilisés pour le calcul des experts sur le CPU.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--pool-workers&amp;quot;,&lt;br /&gt;
 &amp;quot;10&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Sur un processeur 12 cœurs / 24 threads, 10 workers accompagnés du thread hôte de Strata utilisent 11 cœurs physiques, ce qui laisse un cœur physique libre pour les threads auxiliaires, CUDA et le système.&lt;br /&gt;
&lt;br /&gt;
=== CPU auxiliaires ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--aux-cpus&amp;lt;/code&amp;gt; permet à Strata de réserver automatiquement certains processeurs logiques aux threads auxiliaires, afin qu’ils ne viennent pas perturber le pool chargé du calcul des experts.&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--aux-cpus&amp;quot;,&lt;br /&gt;
 &amp;quot;auto&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option peut notamment être utile lorsque le processeur est fortement sollicité par les workers CPU. Les threads auxiliaires, comme certains threads CUDA, de préchargement ou d’adaptation, sont alors déplacés vers des CPU logiques distincts lorsque cela est possible.&lt;br /&gt;
&lt;br /&gt;
=== Réglage vision ===&lt;br /&gt;
* Vision sur CPU :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: &amp;lt;font color = green&amp;gt;false&amp;lt;/font&amp;gt;,&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
* Vision sur GPU auxiliaire :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: true,&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;&amp;quot;cuda_device&amp;quot;: 0,&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Désactiver le partage CPU du prefill ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
La documentation indique que ce partage est activé par défaut sur certaines configurations à un seul GPU, mais reste désactivé par défaut en layer-split multi-GPU.&lt;br /&gt;
}}&lt;br /&gt;
Sur les processeurs ne disposant pas d’AVX-512, il peut être intéressant de désactiver la participation du CPU au prefill afin d’éviter certaines dégradations de performances.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_PREFILL_CPU_SHARE&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
Cette variable désactive le partage du calcul du prefill avec le CPU. Elle peut être utile sur les anciens Xeon AVX2 lorsque le pool CPU perturbe ensuite les performances de décodage.&lt;br /&gt;
&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; est entre guillemets car il s’agit d’une variable d’environnement.&lt;br /&gt;
=== Privilégier la qualité de Qwen à la vitesse ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Concerne la sortie de la version 0.2.7.&lt;br /&gt;
}}&lt;br /&gt;
Certaines optimisations approximatives de Strata privilégient la vitesse au prix de possibles différences de qualité.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON de configuration du modèle, entre &amp;quot;layer_split&amp;quot; et &amp;quot;vision&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_TAIL_SKIP&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_PRIOR&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_KVA&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_ROUTE_TAIL_SKIP=0&amp;lt;/code&amp;gt; : empêche d’ignorer certains experts faiblement pondérés.&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_ROUTE_PRIOR=0&amp;lt;/code&amp;gt; : empêche de favoriser les experts déjà présents en VRAM.&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_KVA=0&amp;lt;/code&amp;gt; : désactive la lecture approximative des longs prompts.&lt;br /&gt;
&lt;br /&gt;
Ne pas ajouter &amp;lt;code&amp;gt;STRATA_DEFAULTS=026&amp;lt;/code&amp;gt; : ce réglage désactiverait également des améliorations sans perte qualitative notable, notamment le &#039;&#039;layer-major prefill&#039;&#039; accélérant fortement la lecture des longs prompts avec deux cartes NVIDIA.&lt;br /&gt;
&lt;br /&gt;
Redémarrer complètement Strata après la modification.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5125</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5125"/>
		<updated>2026-10-28T09:10:22Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Recompilation GPU NVIDIA CUDA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM. &lt;br /&gt;
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev ccache&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Quelques dépendances :&lt;br /&gt;
 # apt install libnccl2 libnccl-dev&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&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 llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
== Utilisation d&#039;un LoRA ==&lt;br /&gt;
=== Installation des dépendances ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # python3 -m venv .venv-convert&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # pip install -U pip&lt;br /&gt;
 # pip install -e .&lt;br /&gt;
=== Conversion ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # python3 convert_lora_to_gguf.py --base-model-id &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt; --trust-remote-code --outtype f16 --outfile /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf /opt/lora/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;/&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Exemple avec &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt;, identifiant Hugging Face.&lt;br /&gt;
}}&lt;br /&gt;
=== Utilisation dans Llama.cpp ===&lt;br /&gt;
Ajouter simplement la ligne suivante :&lt;br /&gt;
 --lora /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf \&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.&lt;br /&gt;
** Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&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;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de configuration d’un modèle MTP + sm tensor ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type draft-mtp \&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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;
== Exemple de configuration d’un modèle MTP + sm tensor +ngram ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type &amp;lt;font color = blue&amp;gt;ngram-mod,&amp;lt;/font&amp;gt;draft-mtp \&lt;br /&gt;
   &amp;lt;font color = blue&amp;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 \&amp;lt;/font&amp;gt;&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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 = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
La combinaison &amp;lt;code&amp;gt;ngram-mod,draft-mtp&amp;lt;/code&amp;gt; permet d&#039;utiliser deux formes de génération spéculative complémentaires. Le MTP prédit quelques tokens à l&#039;avance grâce aux têtes intégrées au modèle, tandis que &amp;lt;code&amp;gt;ngram-mod&amp;lt;/code&amp;gt; recherche dans le contexte des séquences déjà rencontrées afin de proposer directement des blocs plus longs. Cela peut fortement accélérer les régénérations, les reprises de code, les structures répétitives ou les réponses proches d&#039;un texte déjà présent, sans ajouter de second modèle de draft.&lt;br /&gt;
&lt;br /&gt;
Les paramètres &amp;lt;code&amp;gt;--spec-ngram-mod-n-match 24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--spec-ngram-mod-n-min 12&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;--spec-ngram-mod-n-max 48&amp;lt;/code&amp;gt; définissent respectivement la longueur minimale de correspondance recherchée, puis la taille minimale et maximale des blocs proposés. Avec ces valeurs, le mécanisme reste assez sélectif tout en pouvant accélérer nettement les passages répétitifs. Sur du contenu entièrement nouveau, le gain est généralement faible et le MTP reste le principal mécanisme spéculatif.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modèles Embedding ==&lt;br /&gt;
=== [https://huggingface.co/SuperPauly/harrier-oss-v1-0.6b-gguf microsoft/harrier-oss-v1-0.6b] ===&lt;br /&gt;
 # hf download SuperPauly/harrier-oss-v1-0.6b-gguf --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/harrier-oss-v1-0.6b/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-embedding.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Embedding&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/harrier-oss-v1-0.6b/Q8_0/harrier-oss-v1-0.6B-Q8_0.gguf \&lt;br /&gt;
   --alias harrier-oss-v1-0.6b \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --embedding \&lt;br /&gt;
   --pooling last \&lt;br /&gt;
   -c 4096 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 1024 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;--sleep-idle-seconds 300&amp;lt;/font&amp;gt;&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 4096&amp;lt;/code&amp;gt; : définit le contexte maximal accepté par le serveur, ici 4096 tokens. Cette valeur est recommandée pour un serveur d’embedding utilisé avec RAGFlow, car les documents sont normalement découpés en chunks plus petits, souvent autour de 1024 à 2048 tokens. Ce modèle peut monter jusqu’à &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt;, au prix d’une consommation mémoire beaucoup plus élevée.&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;
Pour les modèles d’embedding, les paramètres &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; doivent être configurés avec la même valeur. Par exemple : &amp;lt;code&amp;gt;-b 1024 -ub 1024&amp;lt;/code&amp;gt;. Si &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; est supérieur à &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;llama-server&amp;lt;/code&amp;gt; peut ramener automatiquement les deux valeurs à celle de &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; afin d’éviter une erreur d’assertion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Rerank ==&lt;br /&gt;
=== [https://huggingface.co/Felladrin/gguf-Q8_0-bge-reranker-v2-m3 bge-reranker-v2-m3-Q8_0-GGUF] ===&lt;br /&gt;
 # hf download Felladrin/gguf-Q8_0-bge-reranker-v2-m3 --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/bge-reranker-v2-m3/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/bge-reranker-v2-m3/Q8_0/bge-reranker-v2-m3-q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== [https://huggingface.co/jinaai/jina-reranker-v3.5-GGUF jinaai/jina-reranker-v3.5-GGUF] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
&amp;lt;code&amp;gt;Jina Reranker 3.5&amp;lt;/code&amp;gt; n&#039;est pas encore pris en charge par la version officielle de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;. Ce modèle nécessite un mode encodeur non causal ainsi qu&#039;une option spécifique &amp;lt;code&amp;gt;--output-token-ids&amp;lt;/code&amp;gt;, actuellement absents de la branche officielle. Une pull request est ouverte pour ajouter cette prise en charge : &amp;lt;code&amp;gt;ggml-org/llama.cpp#26286&amp;lt;/code&amp;gt; En attendant son intégration, il faut utiliser le fork de &amp;lt;code&amp;gt;littlewine/llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download jinaai/jina-reranker-v3.5-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/jina-reranker-v3.5/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/jina-reranker-v3.5/Q8_0/jina-reranker-v3.5-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 16384&amp;lt;/code&amp;gt; : valeur confortable pour un serveur de rerank utilisé avec RAGFlow. Le modèle &amp;lt;code&amp;gt;jina-reranker-v3.5&amp;lt;/code&amp;gt; reçoit la requête utilisateur ainsi qu’une liste de chunks candidats à comparer, ce qui nécessite davantage de contexte qu’un modèle d’embedding traitant les chunks individuellement. Il prend théoriquement en charge jusqu’à &amp;lt;code&amp;gt;131072&amp;lt;/code&amp;gt; tokens de contexte, mais une telle valeur augmente fortement la consommation de VRAM ou de RAM et n’est généralement pas utile pour un serveur local. Une fenêtre de &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens offre donc une marge importante pour les requêtes et les chunks habituellement envoyés par RAGFlow.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Img2txt ==&lt;br /&gt;
=== [https://huggingface.co/mradermacher/LightOnOCR-2-1B-GGUF mradermacher/LightOnOCR-2-1B-GGUF] ===&lt;br /&gt;
 # hf download mradermacher/LightOnOCR-2-1B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-f16*.gguf&amp;quot; --local-dir /opt/models/LightOnOCR-2-1B/Q8_0&lt;br /&gt;
 # rm -f /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-Q8_0.gguf&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-img2txt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Img2txt LightOnOCR-2-1B&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.Q8_0.gguf \&lt;br /&gt;
   --mmproj /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-f16.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8082&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 8192&amp;lt;/code&amp;gt; : valeur recommandée pour un serveur Img2txt/OCR utilisé avec LightOnOCR-2-1B. Le modèle supporte jusqu’à &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens, mais &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; offre déjà une marge confortable pour traiter une image ou une page scannée avec beaucoup de texte.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles auxiliaires ==&lt;br /&gt;
=== Vision ===&lt;br /&gt;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Thinking-GGUF/tree/main Qwen3-VL-4B-Thinking] (Dépôt officiel) ====&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Thinking-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Thinking-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/Qwen3VL-4B-Thinking-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/mmproj-Qwen3VL-4B-Thinking-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 1.0 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 0.0 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct-GGUF  Qwen3-VL-4B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Instruct-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 5,25gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/Qwen3VL-4B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/mmproj-Qwen3VL-4B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct-GGUF  Qwen3-VL-2B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-2B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 3gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/Qwen3VL-2B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
=== Généraliste ===&lt;br /&gt;
==== [https://huggingface.co/bartowski/LiquidAI_LFM2.5-2.6B-GGUF LFM2.5-2.6B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
FM2.5-2.6B est un petit modèle performant et multilingue, particulièrement adapté aux usages agentiques et aux appels d&#039;outils. LiquidAI fournit notamment des exemples de configuration pour Hermes, OpenClaw et Pi. Il prend nativement en charge une fenêtre de contexte allant jusqu&#039;à 131072 tokens, ce qui est particulièrement intéressant pour certaines tâches auxiliaires nécessitant un contexte important, comme le module de compression de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # hf download bartowski/LiquidAI_LFM2.5-2.6B-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L/LiquidAI_LFM2.5-2.6B-Q6_K_L.gguf \&lt;br /&gt;
   --alias LiquidAI_LFM2.5-2.6B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 131072 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
== Modèles de langage spécialisés en traduction ==&lt;br /&gt;
=== [[https://huggingface.co/unsloth/Hy-MT2-7B-GGUF Hy-MT2-7B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-7B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-7B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-7B/UD-Q6_K_XL/Hy-MT2-7B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [[https://huggingface.co/unsloth/Hy-MT2-1.8B-GGUF Hy-MT2-1.8B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-1.8B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL/Hy-MT2-1.8B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/mradermacher/Hunyuan-MT-7B-GGUF Hunyuan-MT-7B] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Modèle ancien et dépassé. De plus, sa licence interdit son utilisation dans de nombreux territoires, dont l&#039;Union européenne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download mradermacher/Hunyuan-MT-7B-GGUF --include &amp;quot;*Q6*.gguf&amp;quot; --local-dir /opt/models/Hunyuan-MT-7B/Q6_K&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hunyuan-MT-7B/Q6_K/Hunyuan-MT-7B.Q6_K.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&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 2048 \&lt;br /&gt;
     -ub 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat] pour test traduction intelligente rapide ===&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*Q4*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 bf16 \&lt;br /&gt;
     -ctv bf16 \&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;
     --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-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q4_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;
 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;
=== [https://huggingface.co/unsloth/gemma-4-31B-it-qat-GGUF gemma-4-31B-it-qat] pour test traduction intelligente (2x 12 Go de VRAM) ===&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;MTP/mtp-gemma-4-31B-it-Q8_0.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 512 \&lt;br /&gt;
     -ub 512 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --spec-type ngram-mod,ngram-map-k4v,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-ngram-map-k4v-size-n 12 \&lt;br /&gt;
     --spec-ngram-map-k4v-size-m 48 \&lt;br /&gt;
     --spec-ngram-map-k4v-min-hits 1 \&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;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5124</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5124"/>
		<updated>2026-10-28T09:03:44Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* LFM2.5-2.6B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM. &lt;br /&gt;
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev ccache&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Quelques dépendances :&lt;br /&gt;
 # apt install libnccl2 libnccl-dev&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&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 llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
== Utilisation d&#039;un LoRA ==&lt;br /&gt;
=== Installation des dépendances ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # python3 -m venv .venv-convert&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # pip install -U pip&lt;br /&gt;
 # pip install -e .&lt;br /&gt;
=== Conversion ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # python3 convert_lora_to_gguf.py --base-model-id &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt; --trust-remote-code --outtype f16 --outfile /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf /opt/lora/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;/&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Exemple avec &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt;, identifiant Hugging Face.&lt;br /&gt;
}}&lt;br /&gt;
=== Utilisation dans Llama.cpp ===&lt;br /&gt;
Ajouter simplement la ligne suivante :&lt;br /&gt;
 --lora /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf \&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.&lt;br /&gt;
** Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&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;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de configuration d’un modèle MTP + sm tensor ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type draft-mtp \&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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;
== Exemple de configuration d’un modèle MTP + sm tensor +ngram ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type &amp;lt;font color = blue&amp;gt;ngram-mod,&amp;lt;/font&amp;gt;draft-mtp \&lt;br /&gt;
   &amp;lt;font color = blue&amp;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 \&amp;lt;/font&amp;gt;&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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 = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
La combinaison &amp;lt;code&amp;gt;ngram-mod,draft-mtp&amp;lt;/code&amp;gt; permet d&#039;utiliser deux formes de génération spéculative complémentaires. Le MTP prédit quelques tokens à l&#039;avance grâce aux têtes intégrées au modèle, tandis que &amp;lt;code&amp;gt;ngram-mod&amp;lt;/code&amp;gt; recherche dans le contexte des séquences déjà rencontrées afin de proposer directement des blocs plus longs. Cela peut fortement accélérer les régénérations, les reprises de code, les structures répétitives ou les réponses proches d&#039;un texte déjà présent, sans ajouter de second modèle de draft.&lt;br /&gt;
&lt;br /&gt;
Les paramètres &amp;lt;code&amp;gt;--spec-ngram-mod-n-match 24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--spec-ngram-mod-n-min 12&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;--spec-ngram-mod-n-max 48&amp;lt;/code&amp;gt; définissent respectivement la longueur minimale de correspondance recherchée, puis la taille minimale et maximale des blocs proposés. Avec ces valeurs, le mécanisme reste assez sélectif tout en pouvant accélérer nettement les passages répétitifs. Sur du contenu entièrement nouveau, le gain est généralement faible et le MTP reste le principal mécanisme spéculatif.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modèles Embedding ==&lt;br /&gt;
=== [https://huggingface.co/SuperPauly/harrier-oss-v1-0.6b-gguf microsoft/harrier-oss-v1-0.6b] ===&lt;br /&gt;
 # hf download SuperPauly/harrier-oss-v1-0.6b-gguf --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/harrier-oss-v1-0.6b/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-embedding.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Embedding&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/harrier-oss-v1-0.6b/Q8_0/harrier-oss-v1-0.6B-Q8_0.gguf \&lt;br /&gt;
   --alias harrier-oss-v1-0.6b \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --embedding \&lt;br /&gt;
   --pooling last \&lt;br /&gt;
   -c 4096 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 1024 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;--sleep-idle-seconds 300&amp;lt;/font&amp;gt;&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 4096&amp;lt;/code&amp;gt; : définit le contexte maximal accepté par le serveur, ici 4096 tokens. Cette valeur est recommandée pour un serveur d’embedding utilisé avec RAGFlow, car les documents sont normalement découpés en chunks plus petits, souvent autour de 1024 à 2048 tokens. Ce modèle peut monter jusqu’à &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt;, au prix d’une consommation mémoire beaucoup plus élevée.&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;
Pour les modèles d’embedding, les paramètres &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; doivent être configurés avec la même valeur. Par exemple : &amp;lt;code&amp;gt;-b 1024 -ub 1024&amp;lt;/code&amp;gt;. Si &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; est supérieur à &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;llama-server&amp;lt;/code&amp;gt; peut ramener automatiquement les deux valeurs à celle de &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; afin d’éviter une erreur d’assertion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Rerank ==&lt;br /&gt;
=== [https://huggingface.co/Felladrin/gguf-Q8_0-bge-reranker-v2-m3 bge-reranker-v2-m3-Q8_0-GGUF] ===&lt;br /&gt;
 # hf download Felladrin/gguf-Q8_0-bge-reranker-v2-m3 --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/bge-reranker-v2-m3/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/bge-reranker-v2-m3/Q8_0/bge-reranker-v2-m3-q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== [https://huggingface.co/jinaai/jina-reranker-v3.5-GGUF jinaai/jina-reranker-v3.5-GGUF] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
&amp;lt;code&amp;gt;Jina Reranker 3.5&amp;lt;/code&amp;gt; n&#039;est pas encore pris en charge par la version officielle de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;. Ce modèle nécessite un mode encodeur non causal ainsi qu&#039;une option spécifique &amp;lt;code&amp;gt;--output-token-ids&amp;lt;/code&amp;gt;, actuellement absents de la branche officielle. Une pull request est ouverte pour ajouter cette prise en charge : &amp;lt;code&amp;gt;ggml-org/llama.cpp#26286&amp;lt;/code&amp;gt; En attendant son intégration, il faut utiliser le fork de &amp;lt;code&amp;gt;littlewine/llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download jinaai/jina-reranker-v3.5-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/jina-reranker-v3.5/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/jina-reranker-v3.5/Q8_0/jina-reranker-v3.5-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 16384&amp;lt;/code&amp;gt; : valeur confortable pour un serveur de rerank utilisé avec RAGFlow. Le modèle &amp;lt;code&amp;gt;jina-reranker-v3.5&amp;lt;/code&amp;gt; reçoit la requête utilisateur ainsi qu’une liste de chunks candidats à comparer, ce qui nécessite davantage de contexte qu’un modèle d’embedding traitant les chunks individuellement. Il prend théoriquement en charge jusqu’à &amp;lt;code&amp;gt;131072&amp;lt;/code&amp;gt; tokens de contexte, mais une telle valeur augmente fortement la consommation de VRAM ou de RAM et n’est généralement pas utile pour un serveur local. Une fenêtre de &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens offre donc une marge importante pour les requêtes et les chunks habituellement envoyés par RAGFlow.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Img2txt ==&lt;br /&gt;
=== [https://huggingface.co/mradermacher/LightOnOCR-2-1B-GGUF mradermacher/LightOnOCR-2-1B-GGUF] ===&lt;br /&gt;
 # hf download mradermacher/LightOnOCR-2-1B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-f16*.gguf&amp;quot; --local-dir /opt/models/LightOnOCR-2-1B/Q8_0&lt;br /&gt;
 # rm -f /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-Q8_0.gguf&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-img2txt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Img2txt LightOnOCR-2-1B&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.Q8_0.gguf \&lt;br /&gt;
   --mmproj /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-f16.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8082&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 8192&amp;lt;/code&amp;gt; : valeur recommandée pour un serveur Img2txt/OCR utilisé avec LightOnOCR-2-1B. Le modèle supporte jusqu’à &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens, mais &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; offre déjà une marge confortable pour traiter une image ou une page scannée avec beaucoup de texte.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles auxiliaires ==&lt;br /&gt;
=== Vision ===&lt;br /&gt;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Thinking-GGUF/tree/main Qwen3-VL-4B-Thinking] (Dépôt officiel) ====&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Thinking-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Thinking-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/Qwen3VL-4B-Thinking-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/mmproj-Qwen3VL-4B-Thinking-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 1.0 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 0.0 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct-GGUF  Qwen3-VL-4B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Instruct-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 5,25gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/Qwen3VL-4B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/mmproj-Qwen3VL-4B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct-GGUF  Qwen3-VL-2B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-2B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 3gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/Qwen3VL-2B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
=== Généraliste ===&lt;br /&gt;
==== [https://huggingface.co/bartowski/LiquidAI_LFM2.5-2.6B-GGUF LFM2.5-2.6B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
FM2.5-2.6B est un petit modèle performant et multilingue, particulièrement adapté aux usages agentiques et aux appels d&#039;outils. LiquidAI fournit notamment des exemples de configuration pour Hermes, OpenClaw et Pi. Il prend nativement en charge une fenêtre de contexte allant jusqu&#039;à 131072 tokens, ce qui est particulièrement intéressant pour certaines tâches auxiliaires nécessitant un contexte important, comme le module de compression de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # hf download bartowski/LiquidAI_LFM2.5-2.6B-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-aux_general.service &lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Auxiliary&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L/LiquidAI_LFM2.5-2.6B-Q6_K_L.gguf \&lt;br /&gt;
   --alias LiquidAI_LFM2.5-2.6B \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;192.168.1.123&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port 8085 \&lt;br /&gt;
   --api-key &amp;lt;font color = green&amp;gt;MON_API_KEY&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 131072 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 512 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 50 \&lt;br /&gt;
   --temp 0.1 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.1 \&lt;br /&gt;
   --sleep-idle-seconds 600&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;
== Modèles de langage spécialisés en traduction ==&lt;br /&gt;
=== [[https://huggingface.co/unsloth/Hy-MT2-7B-GGUF Hy-MT2-7B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-7B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-7B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-7B/UD-Q6_K_XL/Hy-MT2-7B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [[https://huggingface.co/unsloth/Hy-MT2-1.8B-GGUF Hy-MT2-1.8B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-1.8B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL/Hy-MT2-1.8B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/mradermacher/Hunyuan-MT-7B-GGUF Hunyuan-MT-7B] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Modèle ancien et dépassé. De plus, sa licence interdit son utilisation dans de nombreux territoires, dont l&#039;Union européenne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download mradermacher/Hunyuan-MT-7B-GGUF --include &amp;quot;*Q6*.gguf&amp;quot; --local-dir /opt/models/Hunyuan-MT-7B/Q6_K&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hunyuan-MT-7B/Q6_K/Hunyuan-MT-7B.Q6_K.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&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 2048 \&lt;br /&gt;
     -ub 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat] pour test traduction intelligente rapide ===&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*Q4*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 bf16 \&lt;br /&gt;
     -ctv bf16 \&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;
     --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-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q4_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;
 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;
=== [https://huggingface.co/unsloth/gemma-4-31B-it-qat-GGUF gemma-4-31B-it-qat] pour test traduction intelligente (2x 12 Go de VRAM) ===&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;MTP/mtp-gemma-4-31B-it-Q8_0.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 512 \&lt;br /&gt;
     -ub 512 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --spec-type ngram-mod,ngram-map-k4v,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-ngram-map-k4v-size-n 12 \&lt;br /&gt;
     --spec-ngram-map-k4v-size-m 48 \&lt;br /&gt;
     --spec-ngram-map-k4v-min-hits 1 \&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;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5123</id>
		<title>Strata</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5123"/>
		<updated>2026-10-28T08:40:54Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
 # sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
 # sudo apt install git build-essential&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # sudo git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/Niko1221/Strata.git&lt;br /&gt;
 # cd Strata&lt;br /&gt;
 # sudo ./setup.sh&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
 # cd /opt/Strata&lt;br /&gt;
 # sudo ./update.sh&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Après avoir laissé le moteur effectuer son réglage automatique, il est possible d’ajuster manuellement certains paramètres :&lt;br /&gt;
&lt;br /&gt;
 # sudo vi /opt/Strata/&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;strata-unsloth-ud-iq4_xs&amp;lt;/font&amp;gt;.json&lt;br /&gt;
&lt;br /&gt;
=== Table N-GRAM en RAM ===&lt;br /&gt;
&lt;br /&gt;
Pour charger la table N-GRAM en RAM plutôt que depuis le stockage, ajouter les paramètres suivants dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--ple-io&amp;quot;,&lt;br /&gt;
 &amp;quot;ram&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option est particulièrement intéressante lorsque le modèle est stocké sur un SSD SATA ou un support relativement lent.&lt;br /&gt;
&lt;br /&gt;
=== fit_max_tokens ===&lt;br /&gt;
&lt;br /&gt;
Pour éviter qu’une requête soit refusée lorsque la somme du prompt et du nombre maximal de tokens de sortie dépasse la taille du contexte, ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;fit_max_tokens&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
Strata réduit alors automatiquement &amp;lt;code&amp;gt;max_tokens&amp;lt;/code&amp;gt; afin que la réponse tienne dans le contexte restant.&lt;br /&gt;
&lt;br /&gt;
=== Nombre de workers CPU ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--pool-workers&amp;lt;/code&amp;gt; permet de définir le nombre de workers utilisés pour le calcul des experts sur le CPU.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--pool-workers&amp;quot;,&lt;br /&gt;
 &amp;quot;10&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Sur un processeur 12 cœurs / 24 threads, 10 workers accompagnés du thread hôte de Strata utilisent 11 cœurs physiques, ce qui laisse un cœur physique libre pour les threads auxiliaires, CUDA et le système.&lt;br /&gt;
&lt;br /&gt;
=== CPU auxiliaires ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--aux-cpus&amp;lt;/code&amp;gt; permet à Strata de réserver automatiquement certains processeurs logiques aux threads auxiliaires, afin qu’ils ne viennent pas perturber le pool chargé du calcul des experts.&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--aux-cpus&amp;quot;,&lt;br /&gt;
 &amp;quot;auto&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option peut notamment être utile lorsque le processeur est fortement sollicité par les workers CPU. Les threads auxiliaires, comme certains threads CUDA, de préchargement ou d’adaptation, sont alors déplacés vers des CPU logiques distincts lorsque cela est possible.&lt;br /&gt;
&lt;br /&gt;
=== Réglage vision ===&lt;br /&gt;
* Vision sur CPU :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: &amp;lt;font color = green&amp;gt;false&amp;lt;/font&amp;gt;,&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
* Vision sur GPU auxiliaire :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: true,&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;&amp;quot;cuda_device&amp;quot;: 0,&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Désactiver le partage CPU du prefill ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
La documentation indique que ce partage est activé par défaut sur certaines configurations à un seul GPU, mais reste désactivé par défaut en layer-split multi-GPU.&lt;br /&gt;
}}&lt;br /&gt;
Sur les processeurs ne disposant pas d’AVX-512, il peut être intéressant de désactiver la participation du CPU au prefill afin d’éviter certaines dégradations de performances.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_PREFILL_CPU_SHARE&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
Cette variable désactive le partage du calcul du prefill avec le CPU. Elle peut être utile sur les anciens Xeon AVX2 lorsque le pool CPU perturbe ensuite les performances de décodage.&lt;br /&gt;
&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; est entre guillemets car il s’agit d’une variable d’environnement.&lt;br /&gt;
=== Privilégier la qualité de Qwen à la vitesse ===&lt;br /&gt;
&lt;br /&gt;
Certaines optimisations approximatives de Strata privilégient la vitesse au prix de possibles différences de qualité.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON de configuration du modèle, entre &amp;quot;layer_split&amp;quot; et &amp;quot;vision&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_TAIL_SKIP&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_PRIOR&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_KVA&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_ROUTE_TAIL_SKIP=0&amp;lt;/code&amp;gt; : empêche d’ignorer certains experts faiblement pondérés.&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_ROUTE_PRIOR=0&amp;lt;/code&amp;gt; : empêche de favoriser les experts déjà présents en VRAM.&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_KVA=0&amp;lt;/code&amp;gt; : désactive la lecture approximative des longs prompts.&lt;br /&gt;
&lt;br /&gt;
Ne pas ajouter &amp;lt;code&amp;gt;STRATA_DEFAULTS=026&amp;lt;/code&amp;gt; : ce réglage désactiverait également des améliorations sans perte qualitative notable, notamment le &#039;&#039;layer-major prefill&#039;&#039; accélérant fortement la lecture des longs prompts avec deux cartes NVIDIA.&lt;br /&gt;
&lt;br /&gt;
Redémarrer complètement Strata après la modification.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5122</id>
		<title>Strata</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5122"/>
		<updated>2026-10-28T08:07:24Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Privilégier la qualité de Qwen à la vitesse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
 # sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
 # sudo apt install git build-essential&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # sudo git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/Niko1221/Strata.git&lt;br /&gt;
 # cd Strata&lt;br /&gt;
 # sudo ./setup.sh&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
 # cd /opt/Strata&lt;br /&gt;
 # sudo ./update.sh&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Après avoir laissé le moteur effectuer son réglage automatique, il est possible d’ajuster manuellement certains paramètres :&lt;br /&gt;
&lt;br /&gt;
 # sudo vi /opt/Strata/&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;strata-unsloth-ud-iq4_xs&amp;lt;/font&amp;gt;.json&lt;br /&gt;
&lt;br /&gt;
=== Table N-GRAM en RAM ===&lt;br /&gt;
&lt;br /&gt;
Pour charger la table N-GRAM en RAM plutôt que depuis le stockage, ajouter les paramètres suivants dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--ple-io&amp;quot;,&lt;br /&gt;
 &amp;quot;ram&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option est particulièrement intéressante lorsque le modèle est stocké sur un SSD SATA ou un support relativement lent.&lt;br /&gt;
&lt;br /&gt;
=== fit_max_tokens ===&lt;br /&gt;
&lt;br /&gt;
Pour éviter qu’une requête soit refusée lorsque la somme du prompt et du nombre maximal de tokens de sortie dépasse la taille du contexte, ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;fit_max_tokens&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
Strata réduit alors automatiquement &amp;lt;code&amp;gt;max_tokens&amp;lt;/code&amp;gt; afin que la réponse tienne dans le contexte restant.&lt;br /&gt;
&lt;br /&gt;
=== Nombre de workers CPU ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--pool-workers&amp;lt;/code&amp;gt; permet de définir le nombre de workers utilisés pour le calcul des experts sur le CPU.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--pool-workers&amp;quot;,&lt;br /&gt;
 &amp;quot;10&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Sur un processeur 12 cœurs / 24 threads, 10 workers accompagnés du thread hôte de Strata utilisent 11 cœurs physiques, ce qui laisse un cœur physique libre pour les threads auxiliaires, CUDA et le système.&lt;br /&gt;
&lt;br /&gt;
=== CPU auxiliaires ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--aux-cpus&amp;lt;/code&amp;gt; permet à Strata de réserver automatiquement certains processeurs logiques aux threads auxiliaires, afin qu’ils ne viennent pas perturber le pool chargé du calcul des experts.&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--aux-cpus&amp;quot;,&lt;br /&gt;
 &amp;quot;auto&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option peut notamment être utile lorsque le processeur est fortement sollicité par les workers CPU. Les threads auxiliaires, comme certains threads CUDA, de préchargement ou d’adaptation, sont alors déplacés vers des CPU logiques distincts lorsque cela est possible.&lt;br /&gt;
&lt;br /&gt;
=== Réglage vision ===&lt;br /&gt;
* Vision sur CPU :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: &amp;lt;font color = green&amp;gt;false&amp;lt;/font&amp;gt;,&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
* Vision sur GPU auxiliaire :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: true,&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;&amp;quot;cuda_device&amp;quot;: 0,&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Désactiver le partage CPU du prefill ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
La documentation indique que ce partage est activé par défaut sur certaines configurations à un seul GPU, mais reste désactivé par défaut en layer-split multi-GPU.&lt;br /&gt;
}}&lt;br /&gt;
Sur les processeurs ne disposant pas d’AVX-512, il peut être intéressant de désactiver la participation du CPU au prefill afin d’éviter certaines dégradations de performances.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_PREFILL_CPU_SHARE&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
Cette variable désactive le partage du calcul du prefill avec le CPU. Elle peut être utile sur les anciens Xeon AVX2 lorsque le pool CPU perturbe ensuite les performances de décodage.&lt;br /&gt;
&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; est entre guillemets car il s’agit d’une variable d’environnement.&lt;br /&gt;
=== Privilégier la qualité de Qwen à la vitesse ===&lt;br /&gt;
&lt;br /&gt;
Certaines optimisations de Strata, dont de nouveaux réglages introduits en version 0.2.7, privilégient la vitesse au prix de possibles différences de qualité.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON de configuration du modèle, entre &amp;quot;layer_split&amp;quot; et &amp;quot;vision&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_DEFAULTS&amp;quot;: &amp;quot;026&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_TAIL_SKIP&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_PRIOR&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_KVA&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_DEFAULTS=026&amp;lt;/code&amp;gt; : rétablit les réglages automatiques de Qwen utilisés par Strata 0.2.6.&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_ROUTE_TAIL_SKIP=0&amp;lt;/code&amp;gt; : empêche d’ignorer certains experts faiblement pondérés.&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_ROUTE_PRIOR=0&amp;lt;/code&amp;gt; : empêche de favoriser les experts déjà présents en VRAM.&lt;br /&gt;
* &amp;lt;code&amp;gt;STRATA_KVA=0&amp;lt;/code&amp;gt; : désactive la lecture approximative des longs prompts.&lt;br /&gt;
&lt;br /&gt;
Redémarrer complètement Strata après la modification.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5121</id>
		<title>Strata</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5121"/>
		<updated>2026-10-28T08:06:47Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Privilégier la qualité de Qwen à la vitesse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
 # sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
 # sudo apt install git build-essential&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # sudo git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/Niko1221/Strata.git&lt;br /&gt;
 # cd Strata&lt;br /&gt;
 # sudo ./setup.sh&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
 # cd /opt/Strata&lt;br /&gt;
 # sudo ./update.sh&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Après avoir laissé le moteur effectuer son réglage automatique, il est possible d’ajuster manuellement certains paramètres :&lt;br /&gt;
&lt;br /&gt;
 # sudo vi /opt/Strata/&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;strata-unsloth-ud-iq4_xs&amp;lt;/font&amp;gt;.json&lt;br /&gt;
&lt;br /&gt;
=== Table N-GRAM en RAM ===&lt;br /&gt;
&lt;br /&gt;
Pour charger la table N-GRAM en RAM plutôt que depuis le stockage, ajouter les paramètres suivants dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--ple-io&amp;quot;,&lt;br /&gt;
 &amp;quot;ram&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option est particulièrement intéressante lorsque le modèle est stocké sur un SSD SATA ou un support relativement lent.&lt;br /&gt;
&lt;br /&gt;
=== fit_max_tokens ===&lt;br /&gt;
&lt;br /&gt;
Pour éviter qu’une requête soit refusée lorsque la somme du prompt et du nombre maximal de tokens de sortie dépasse la taille du contexte, ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;fit_max_tokens&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
Strata réduit alors automatiquement &amp;lt;code&amp;gt;max_tokens&amp;lt;/code&amp;gt; afin que la réponse tienne dans le contexte restant.&lt;br /&gt;
&lt;br /&gt;
=== Nombre de workers CPU ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--pool-workers&amp;lt;/code&amp;gt; permet de définir le nombre de workers utilisés pour le calcul des experts sur le CPU.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--pool-workers&amp;quot;,&lt;br /&gt;
 &amp;quot;10&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Sur un processeur 12 cœurs / 24 threads, 10 workers accompagnés du thread hôte de Strata utilisent 11 cœurs physiques, ce qui laisse un cœur physique libre pour les threads auxiliaires, CUDA et le système.&lt;br /&gt;
&lt;br /&gt;
=== CPU auxiliaires ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--aux-cpus&amp;lt;/code&amp;gt; permet à Strata de réserver automatiquement certains processeurs logiques aux threads auxiliaires, afin qu’ils ne viennent pas perturber le pool chargé du calcul des experts.&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--aux-cpus&amp;quot;,&lt;br /&gt;
 &amp;quot;auto&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option peut notamment être utile lorsque le processeur est fortement sollicité par les workers CPU. Les threads auxiliaires, comme certains threads CUDA, de préchargement ou d’adaptation, sont alors déplacés vers des CPU logiques distincts lorsque cela est possible.&lt;br /&gt;
&lt;br /&gt;
=== Réglage vision ===&lt;br /&gt;
* Vision sur CPU :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: &amp;lt;font color = green&amp;gt;false&amp;lt;/font&amp;gt;,&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
* Vision sur GPU auxiliaire :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: true,&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;&amp;quot;cuda_device&amp;quot;: 0,&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Désactiver le partage CPU du prefill ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
La documentation indique que ce partage est activé par défaut sur certaines configurations à un seul GPU, mais reste désactivé par défaut en layer-split multi-GPU.&lt;br /&gt;
}}&lt;br /&gt;
Sur les processeurs ne disposant pas d’AVX-512, il peut être intéressant de désactiver la participation du CPU au prefill afin d’éviter certaines dégradations de performances.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_PREFILL_CPU_SHARE&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
Cette variable désactive le partage du calcul du prefill avec le CPU. Elle peut être utile sur les anciens Xeon AVX2 lorsque le pool CPU perturbe ensuite les performances de décodage.&lt;br /&gt;
&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; est entre guillemets car il s’agit d’une variable d’environnement.&lt;br /&gt;
=== Privilégier la qualité de Qwen à la vitesse ===&lt;br /&gt;
&lt;br /&gt;
Certaines optimisations de Strata, dont de nouveaux réglages introduits en version 0.2.7, privilégient la vitesse au prix de possibles différences de qualité.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON de configuration du modèle, entre &amp;quot;layer_split&amp;quot; et &amp;quot;vision&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_DEFAULTS&amp;quot;: &amp;quot;026&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_TAIL_SKIP&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_PRIOR&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_KVA&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
* STRATA_DEFAULTS=026 : rétablit les réglages automatiques de Qwen utilisés par Strata 0.2.6.&lt;br /&gt;
* STRATA_ROUTE_TAIL_SKIP=0 : empêche d’ignorer certains experts faiblement pondérés.&lt;br /&gt;
* STRATA_ROUTE_PRIOR=0 : empêche de favoriser les experts déjà présents en VRAM.&lt;br /&gt;
* STRATA_KVA=0 : désactive la lecture approximative des longs prompts.&lt;br /&gt;
&lt;br /&gt;
Redémarrer complètement Strata après la modification.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5120</id>
		<title>Strata</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5120"/>
		<updated>2026-10-28T08:03:43Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
 # sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
 # sudo apt install git build-essential&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # sudo git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/Niko1221/Strata.git&lt;br /&gt;
 # cd Strata&lt;br /&gt;
 # sudo ./setup.sh&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
 # cd /opt/Strata&lt;br /&gt;
 # sudo ./update.sh&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Après avoir laissé le moteur effectuer son réglage automatique, il est possible d’ajuster manuellement certains paramètres :&lt;br /&gt;
&lt;br /&gt;
 # sudo vi /opt/Strata/&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;strata-unsloth-ud-iq4_xs&amp;lt;/font&amp;gt;.json&lt;br /&gt;
&lt;br /&gt;
=== Table N-GRAM en RAM ===&lt;br /&gt;
&lt;br /&gt;
Pour charger la table N-GRAM en RAM plutôt que depuis le stockage, ajouter les paramètres suivants dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--ple-io&amp;quot;,&lt;br /&gt;
 &amp;quot;ram&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option est particulièrement intéressante lorsque le modèle est stocké sur un SSD SATA ou un support relativement lent.&lt;br /&gt;
&lt;br /&gt;
=== fit_max_tokens ===&lt;br /&gt;
&lt;br /&gt;
Pour éviter qu’une requête soit refusée lorsque la somme du prompt et du nombre maximal de tokens de sortie dépasse la taille du contexte, ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;fit_max_tokens&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
Strata réduit alors automatiquement &amp;lt;code&amp;gt;max_tokens&amp;lt;/code&amp;gt; afin que la réponse tienne dans le contexte restant.&lt;br /&gt;
&lt;br /&gt;
=== Nombre de workers CPU ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--pool-workers&amp;lt;/code&amp;gt; permet de définir le nombre de workers utilisés pour le calcul des experts sur le CPU.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--pool-workers&amp;quot;,&lt;br /&gt;
 &amp;quot;10&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Sur un processeur 12 cœurs / 24 threads, 10 workers accompagnés du thread hôte de Strata utilisent 11 cœurs physiques, ce qui laisse un cœur physique libre pour les threads auxiliaires, CUDA et le système.&lt;br /&gt;
&lt;br /&gt;
=== CPU auxiliaires ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--aux-cpus&amp;lt;/code&amp;gt; permet à Strata de réserver automatiquement certains processeurs logiques aux threads auxiliaires, afin qu’ils ne viennent pas perturber le pool chargé du calcul des experts.&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--aux-cpus&amp;quot;,&lt;br /&gt;
 &amp;quot;auto&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option peut notamment être utile lorsque le processeur est fortement sollicité par les workers CPU. Les threads auxiliaires, comme certains threads CUDA, de préchargement ou d’adaptation, sont alors déplacés vers des CPU logiques distincts lorsque cela est possible.&lt;br /&gt;
&lt;br /&gt;
=== Réglage vision ===&lt;br /&gt;
* Vision sur CPU :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: &amp;lt;font color = green&amp;gt;false&amp;lt;/font&amp;gt;,&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
* Vision sur GPU auxiliaire :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: true,&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;&amp;quot;cuda_device&amp;quot;: 0,&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Désactiver le partage CPU du prefill ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
La documentation indique que ce partage est activé par défaut sur certaines configurations à un seul GPU, mais reste désactivé par défaut en layer-split multi-GPU.&lt;br /&gt;
}}&lt;br /&gt;
Sur les processeurs ne disposant pas d’AVX-512, il peut être intéressant de désactiver la participation du CPU au prefill afin d’éviter certaines dégradations de performances.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_PREFILL_CPU_SHARE&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
Cette variable désactive le partage du calcul du prefill avec le CPU. Elle peut être utile sur les anciens Xeon AVX2 lorsque le pool CPU perturbe ensuite les performances de décodage.&lt;br /&gt;
&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; est entre guillemets car il s’agit d’une variable d’environnement.&lt;br /&gt;
=== Privilégier la qualité de Qwen à la vitesse ===&lt;br /&gt;
Ajouter à la racine du fichier JSON de configuration du modèle, entre &amp;quot;layer_split&amp;quot; et &amp;quot;vision&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_DEFAULTS&amp;quot;: &amp;quot;026&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_TAIL_SKIP&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_ROUTE_PRIOR&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
   &amp;quot;STRATA_KVA&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
* STRATA_DEFAULTS=026 : rétablit les réglages de Strata 0.2.6.&lt;br /&gt;
* STRATA_ROUTE_TAIL_SKIP=0 : empêche d’ignorer certains experts.&lt;br /&gt;
* STRATA_ROUTE_PRIOR=0 : empêche de favoriser les experts déjà en VRAM.&lt;br /&gt;
* STRATA_KVA=0 : désactive la lecture approximative des longs prompts.&lt;br /&gt;
&lt;br /&gt;
Redémarrer complètement Strata après la modification.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5119</id>
		<title>Strata</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Strata&amp;diff=5119"/>
		<updated>2026-10-25T06:16:47Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
 # sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
 # sudo apt install git build-essential&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # sudo git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/Niko1221/Strata.git&lt;br /&gt;
 # cd Strata&lt;br /&gt;
 # sudo ./setup.sh&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
 # cd /opt/Strata&lt;br /&gt;
 # sudo ./update.sh&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Après avoir laissé le moteur effectuer son réglage automatique, il est possible d’ajuster manuellement certains paramètres :&lt;br /&gt;
&lt;br /&gt;
 # sudo vi /opt/Strata/&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;strata-unsloth-ud-iq4_xs&amp;lt;/font&amp;gt;.json&lt;br /&gt;
&lt;br /&gt;
=== Table N-GRAM en RAM ===&lt;br /&gt;
&lt;br /&gt;
Pour charger la table N-GRAM en RAM plutôt que depuis le stockage, ajouter les paramètres suivants dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--ple-io&amp;quot;,&lt;br /&gt;
 &amp;quot;ram&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option est particulièrement intéressante lorsque le modèle est stocké sur un SSD SATA ou un support relativement lent.&lt;br /&gt;
&lt;br /&gt;
=== fit_max_tokens ===&lt;br /&gt;
&lt;br /&gt;
Pour éviter qu’une requête soit refusée lorsque la somme du prompt et du nombre maximal de tokens de sortie dépasse la taille du contexte, ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;fit_max_tokens&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
Strata réduit alors automatiquement &amp;lt;code&amp;gt;max_tokens&amp;lt;/code&amp;gt; afin que la réponse tienne dans le contexte restant.&lt;br /&gt;
&lt;br /&gt;
=== Nombre de workers CPU ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--pool-workers&amp;lt;/code&amp;gt; permet de définir le nombre de workers utilisés pour le calcul des experts sur le CPU.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--pool-workers&amp;quot;,&lt;br /&gt;
 &amp;quot;10&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Sur un processeur 12 cœurs / 24 threads, 10 workers accompagnés du thread hôte de Strata utilisent 11 cœurs physiques, ce qui laisse un cœur physique libre pour les threads auxiliaires, CUDA et le système.&lt;br /&gt;
&lt;br /&gt;
=== CPU auxiliaires ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--aux-cpus&amp;lt;/code&amp;gt; permet à Strata de réserver automatiquement certains processeurs logiques aux threads auxiliaires, afin qu’ils ne viennent pas perturber le pool chargé du calcul des experts.&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la section &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;--aux-cpus&amp;quot;,&lt;br /&gt;
 &amp;quot;auto&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Cette option peut notamment être utile lorsque le processeur est fortement sollicité par les workers CPU. Les threads auxiliaires, comme certains threads CUDA, de préchargement ou d’adaptation, sont alors déplacés vers des CPU logiques distincts lorsque cela est possible.&lt;br /&gt;
&lt;br /&gt;
=== Réglage vision ===&lt;br /&gt;
* Vision sur CPU :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: &amp;lt;font color = green&amp;gt;false&amp;lt;/font&amp;gt;,&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
* Vision sur GPU auxiliaire :&lt;br /&gt;
  &amp;quot;vision&amp;quot;: {&lt;br /&gt;
   &amp;quot;exe&amp;quot;: &amp;quot;/opt/Strata/engine/strata-vision&amp;quot;,&lt;br /&gt;
   &amp;quot;mmproj&amp;quot;: &amp;quot;/opt/Strata-data/models/mmproj-Qwen3.8-Flash-Next-BF16.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;model&amp;quot;: &amp;quot;/opt/Strata-data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf&amp;quot;,&lt;br /&gt;
   &amp;quot;gpu&amp;quot;: true,&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;&amp;quot;cuda_device&amp;quot;: 0,&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;quot;max_tokens&amp;quot;: 1024&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Désactiver le partage CPU du prefill ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
La documentation indique que ce partage est activé par défaut sur certaines configurations à un seul GPU, mais reste désactivé par défaut en layer-split multi-GPU.&lt;br /&gt;
}}&lt;br /&gt;
Sur les processeurs ne disposant pas d’AVX-512, il peut être intéressant de désactiver la participation du CPU au prefill afin d’éviter certaines dégradations de performances.&lt;br /&gt;
&lt;br /&gt;
Ajouter à la racine du fichier JSON :&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;env&amp;quot;: {&lt;br /&gt;
   &amp;quot;STRATA_PREFILL_CPU_SHARE&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
 },&lt;br /&gt;
&lt;br /&gt;
Cette variable désactive le partage du calcul du prefill avec le CPU. Elle peut être utile sur les anciens Xeon AVX2 lorsque le pool CPU perturbe ensuite les performances de décodage.&lt;br /&gt;
&lt;br /&gt;
La valeur &amp;lt;code&amp;gt;&amp;quot;0&amp;quot;&amp;lt;/code&amp;gt; est entre guillemets car il s’agit d’une variable d’environnement.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5118</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5118"/>
		<updated>2026-10-24T14:17:22Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Garder toutes les parties de réponse ouvertes (extension keep-expanded) */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
=== Garder toutes les parties de réponse ouvertes (extension keep-expanded) ===&lt;br /&gt;
Par défaut, Hermes WebUI replie automatiquement les parties intermédiaires d&#039;une réponse (le texte que l&#039;IA écrit entre deux appels d&#039;outils) dès qu&#039;il y en a plus de 3 : un lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; apparaît pour les retrouver. Ce comportement est codé en dur (&amp;lt;code&amp;gt;INTERIM_COLLAPSE_THRESHOLD=3&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;static/messages.js&amp;lt;/code&amp;gt;) et ne propose aucune option. Les modèles qui produisent beaucoup de petites notes de progression (Qwen par exemple) le rendent vite pénible, car le bloc de code final peut se retrouver dans une partie repliée.&lt;br /&gt;
&lt;br /&gt;
Le WebUI supporte les extensions CSS (voir &amp;lt;code&amp;gt;docs/EXTENSIONS.md&amp;lt;/code&amp;gt; dans le dépôt). Voici une petite extension maison qui désactive ce repli.&lt;br /&gt;
&lt;br /&gt;
* Étape 1 — Créer le fichier CSS :&lt;br /&gt;
 # mkdir -p ~/.hermes/webui/extensions&lt;br /&gt;
 # vi ~/.hermes/webui/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
Y coller :&lt;br /&gt;
&lt;br /&gt;
 /* Extension hermes-webui : garder depliee chaque segment de reponse&lt;br /&gt;
    (desactive le repli automatique des notes intermediaires). */&lt;br /&gt;
 .interim-collapsed { display: revert !important; }&lt;br /&gt;
 .interim-collapse-toggle { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
* Étape 2 — Déclarer l&#039;extension au service : le service systemd lit déjà &amp;lt;code&amp;gt;EnvironmentFile=-/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (voir le service plus haut), on y ajoute donc deux lignes :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_DIR=/root/.hermes/webui/extensions&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
* Étape 3 — Redémarrer et vérifier :&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
 # systemctl is-active hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Puis recharger la page du WebUI dans le navigateur (F5) : toutes les parties des réponses restent ouvertes, et le lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; a disparu.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Redémarrer le service coupe brièvement la session WebUI en cours (les conversations sont sauvegardées, mais la réponse en cours de rédaction peut être perdue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retour en arrière :&#039;&#039;&#039; supprimer les deux lignes de &amp;lt;code&amp;gt;/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (ou le fichier CSS), puis relancer le service — le repli automatique revient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résistance aux mises à jour :&#039;&#039;&#039; cette configuration survit aux mises à jour normales (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/opt/hermes-webui&amp;lt;/code&amp;gt; puis redémarrage) :&lt;br /&gt;
* &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; est listé dans le &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; du projet : git ne le touche jamais ;&lt;br /&gt;
* le CSS vit dans &amp;lt;code&amp;gt;~/.hermes/webui/extensions/&amp;lt;/code&amp;gt;, hors du dépôt git — c&#039;est le répertoire officiellement recommandé pour les extensions.&lt;br /&gt;
&lt;br /&gt;
Seuls une réinstallation complète (suppression + re-clone) ou un changement de nom des classes &amp;lt;code&amp;gt;interim-collapsed&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;interim-collapse-toggle&amp;lt;/code&amp;gt; côté développeur pourraient casser l&#039;extension. Si le repli revient tout seul après une mise à jour, il suffit de vérifier ces sélecteurs dans le CSS.&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SaerXNG et Firecrawl comme service secondaire afin de rester 100% local, il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/robbyczgw-cla/hermes-web-search-plus.git web-search-plus&lt;br /&gt;
&lt;br /&gt;
On choisit le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; afin de ne pas dépendre de services extérieurs ou payants :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
Entrer l&#039;adresse de son instance SearXNG :&lt;br /&gt;
 SearXNG key (SEARXNG_INSTANCE_URL, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Il n&#039;est pas obligatoire de renseigner une clé à l&#039;invite suivante :&lt;br /&gt;
 Keenable key (KEENABLE_API_KEY, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l&#039;autoriser explicitement :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 SEARXNG_INSTANCE_URL=&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 SEARXNG_ALLOW_PRIVATE=1&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour configurer Firecrawl, si une clef API est nécessaire il faut la renseigner dans le .env :&lt;br /&gt;
&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_KEY=&amp;lt;font color = blue&amp;gt;FIRECRAWL_API_KEY&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 configurer l&#039;instance Firecrawl, il faut modifier la configuration du plugin :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/plugins/web-search-plus/config.py&lt;br /&gt;
Et remplacer :&lt;br /&gt;
     &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
         &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.firecrawl.dev/v2/search&amp;quot;,&lt;br /&gt;
         &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
         &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
         &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
     },&lt;br /&gt;
Par (exemple avec http simple) :&lt;br /&gt;
    &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
        &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
        &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_FIRECRAW&amp;lt;/font&amp;gt;L:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;/v2/scrape&amp;quot;,&lt;br /&gt;
        &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
        &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
        &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
    },&lt;br /&gt;
L&#039;option suivante n&#039;est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
     &amp;quot;extract&amp;quot;: { &lt;br /&gt;
         # Target URLs supplied to extract_plus are blocked when they resolve to&lt;br /&gt;
         # private/internal networks. Operators can opt in for trusted intranet use.&lt;br /&gt;
         &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;True&amp;lt;/font&amp;gt;,&lt;br /&gt;
     },&lt;br /&gt;
&lt;br /&gt;
On teste ensuite le fonctionnement du plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins/web-search-plus&lt;br /&gt;
 # python3 search.py --query &amp;quot;Hermes Agent latest release&amp;quot; --provider auto --quality-report&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
&lt;br /&gt;
On installe Chromium :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install chromium&lt;br /&gt;
&lt;br /&gt;
On vérifie son fonctionnement :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
On ajoute le chemin du binaire DonSeTch à l&#039;environnement d&#039;Hermes :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
 DONSETCH_BIN=/root/.hermes/node/bin/donsetch&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite par défaut le routage automatique à SearXNG et Keenable. On réinitialise donc la configuration afin de repasser sur le profil &amp;lt;code&amp;gt;standard&amp;lt;/code&amp;gt;, puis on autorise Web Search Plus à utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On désactive les autres fournisseurs :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On réapplique les priorités de recherche et d&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On définit Keenable comme fournisseur de secours. Il s&#039;agit d&#039;un fournisseur extérieur disposant d&#039;un accès gratuit limité sans clé API :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
On autorise l&#039;utilisation automatique de DonSeTch :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Pour vérifier la configuration :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour remplacer les outils web natifs (non recommandée et partiellement fonctionnelle)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* (Optionnel) On désactive les outils web natifs de Hermes pour utiliser uniquement ceux du plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Et on ajoute dans la section &amp;lt;code&amp;gt;agent:&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;web&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour référence, aujourd&#039;hui intégrée nativement au plugin depuis la version 4.1.0&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Cette configuration permet de conserver les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes tout en remplaçant leur backend par Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Le modèle continue donc d&#039;utiliser les outils Web habituels de Hermes, mais les recherches et extractions sont transmises de manière transparente à Web Search Plus, qui applique ensuite sa propre configuration de routage vers DonSeTch, SearXNG, Firecrawl ou les autres providers activés.&lt;br /&gt;
&lt;br /&gt;
* Réactiver &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; dans la configuration d&#039;Hermes si nécessaire (supprimer &amp;lt;code&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;) :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Création d&#039;un provider Web pour remplacer de façon transparente les backends utilisés par les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes :&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/web/wsp&lt;br /&gt;
&lt;br /&gt;
On crée le fichier de métadonnées du plugin :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/plugin.yaml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 name: web-wsp&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 description: &amp;quot;Web Search Plus backend for Hermes native web_search/web_extract tools.&amp;quot;&lt;br /&gt;
 author: local&lt;br /&gt;
 kind: backend&lt;br /&gt;
 provides_web_providers:&lt;br /&gt;
   - wsp&lt;br /&gt;
&lt;br /&gt;
On crée ensuite le provider Web. Celui-ci sert d&#039;adaptateur entre les outils natifs de Hermes et Web Search Plus :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/__init__.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
import subprocess&lt;br /&gt;
import sys&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
from typing import Any, Dict, List&lt;br /&gt;
&lt;br /&gt;
from agent.web_search_provider import WebSearchProvider&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WSP_DIR = Path.home() / &amp;quot;.hermes&amp;quot; / &amp;quot;plugins&amp;quot; / &amp;quot;web-search-plus&amp;quot;&lt;br /&gt;
WSP_SEARCH = WSP_DIR / &amp;quot;search.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class WSPWebSearchProvider(WebSearchProvider):&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;wsp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def display_name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;Web Search Plus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def is_available(self) -&amp;gt; bool:&lt;br /&gt;
        return WSP_SEARCH.exists()&lt;br /&gt;
&lt;br /&gt;
    def supports_search(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def supports_extract(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def search(self, query: str, limit: int = 5) -&amp;gt; Dict[str, Any]:&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--query&amp;quot;,&lt;br /&gt;
            query,&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--max-results&amp;quot;,&lt;br /&gt;
            str(limit),&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus search failed: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: proc.stderr.strip() or &amp;quot;Web Search Plus search failed&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for i, item in enumerate(data.get(&amp;quot;results&amp;quot;, [])[:limit], start=1):&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;description&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;snippet&amp;quot;)&lt;br /&gt;
                        or item.get(&amp;quot;description&amp;quot;)&lt;br /&gt;
                        or &amp;quot;&amp;quot;&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;position&amp;quot;: i,&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return {&lt;br /&gt;
            &amp;quot;success&amp;quot;: True,&lt;br /&gt;
            &amp;quot;data&amp;quot;: {&lt;br /&gt;
                &amp;quot;web&amp;quot;: results,&lt;br /&gt;
            },&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    def extract(&lt;br /&gt;
        self,&lt;br /&gt;
        urls: List[str],&lt;br /&gt;
        format: str = &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        **kwargs: Any,&lt;br /&gt;
    ) -&amp;gt; List[Dict[str, Any]]:&lt;br /&gt;
&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--extract-urls&amp;quot;,&lt;br /&gt;
            *urls,&lt;br /&gt;
            &amp;quot;--format&amp;quot;,&lt;br /&gt;
            format or &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus extraction failed: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            error = (&lt;br /&gt;
                proc.stderr.strip()&lt;br /&gt;
                or &amp;quot;Web Search Plus extraction failed&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: error,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if data.get(&amp;quot;error&amp;quot;) and not data.get(&amp;quot;results&amp;quot;):&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: str(data[&amp;quot;error&amp;quot;]),&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for item in data.get(&amp;quot;results&amp;quot;, []):&lt;br /&gt;
            if not isinstance(item, dict):&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            content = str(&lt;br /&gt;
                item.get(&amp;quot;content&amp;quot;)&lt;br /&gt;
                or item.get(&amp;quot;markdown&amp;quot;)&lt;br /&gt;
                or &amp;quot;&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;content&amp;quot;: content,&lt;br /&gt;
                    &amp;quot;raw_content&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;raw_content&amp;quot;)&lt;br /&gt;
                        or content&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                        &amp;quot;provider&amp;quot;: data.get(&amp;quot;provider&amp;quot;),&lt;br /&gt;
                        &amp;quot;fetcher&amp;quot;: item.get(&amp;quot;fetcher&amp;quot;),&lt;br /&gt;
                        &amp;quot;status&amp;quot;: item.get(&amp;quot;status&amp;quot;),&lt;br /&gt;
                        &amp;quot;quality&amp;quot;: item.get(&amp;quot;quality&amp;quot;),&lt;br /&gt;
                        &amp;quot;lang&amp;quot;: item.get(&amp;quot;lang&amp;quot;),&lt;br /&gt;
                        &amp;quot;source_type&amp;quot;: item.get(&amp;quot;source_type&amp;quot;),&lt;br /&gt;
                        &amp;quot;page_type&amp;quot;: item.get(&amp;quot;page_type&amp;quot;),&lt;br /&gt;
                    },&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return results&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def register(ctx) -&amp;gt; None:&lt;br /&gt;
    ctx.register_web_search_provider(WSPWebSearchProvider())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le provider lance Web Search Plus dans un sous-processus distinct pour les recherches comme pour les extractions. Cela évite notamment les conflits entre les modules Python de Hermes et ceux de Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
On active ensuite le plugin :&lt;br /&gt;
 # hermes plugins enable web-wsp&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; à la demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
&lt;br /&gt;
Cette autorisation est nécessaire car le plugin fournit un backend susceptible d&#039;intercepter les appels effectués par les outils Web natifs de Hermes.&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&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;
&amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt; définit le backend Web général, tandis que &amp;lt;code&amp;gt;search_backend&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;extract_backend&amp;lt;/code&amp;gt; permettent de sélectionner explicitement des backends différents pour la recherche et l&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
Avec cette configuration, les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes restent inchangés pour le modèle, mais leurs appels sont transmis de façon transparente à Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On édite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après la mise à jour si celui-ci obtient un verdict &amp;lt;code&amp;gt;dangerous&amp;lt;/code&amp;gt;. Si le plugin est de nouveau désactivé, le réactiver manuellement :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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=5117</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5117"/>
		<updated>2026-10-24T14:08:02Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Garder toutes les parties de réponse ouvertes (extension keep-expanded) */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
=== Garder toutes les parties de réponse ouvertes (extension keep-expanded) ===&lt;br /&gt;
Par défaut, Hermes WebUI replie automatiquement les parties intermédiaires d&#039;une réponse (le texte que l&#039;IA écrit entre deux appels d&#039;outils) dès qu&#039;il y en a plus de 3 : un lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; apparaît pour les retrouver. Ce comportement est codé en dur (&amp;lt;code&amp;gt;INTERIM_COLLAPSE_THRESHOLD=3&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;static/messages.js&amp;lt;/code&amp;gt;) et ne propose aucune option. Les modèles qui produisent beaucoup de petites notes de progression (Qwen par exemple) le rendent vite pénible, car le bloc de code final peut se retrouver dans une partie repliée.&lt;br /&gt;
&lt;br /&gt;
Le WebUI supporte les extensions CSS (voir &amp;lt;code&amp;gt;docs/EXTENSIONS.md&amp;lt;/code&amp;gt; dans le dépôt). Voici une petite extension maison qui désactive ce repli.&lt;br /&gt;
&lt;br /&gt;
* Étape 1 — Créer le fichier CSS :&lt;br /&gt;
 # mkdir -p ~/.hermes/webui/extensions&lt;br /&gt;
 # vi ~/.hermes/webui/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
Y coller :&lt;br /&gt;
&lt;br /&gt;
 /* Extension hermes-webui : garder depliee chaque segment de reponse&lt;br /&gt;
    (desactive le repli automatique des notes intermediaires). */&lt;br /&gt;
 .interim-collapsed { display: revert !important; }&lt;br /&gt;
 .interim-collapse-toggle { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
* Étape 2 — Déclarer l&#039;extension au service : le service systemd lit déjà &amp;lt;code&amp;gt;EnvironmentFile=-/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (voir le service plus haut), on y ajoute donc deux lignes :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_DIR=/root/.hermes/webui/extensions&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
* Étape 3 — Redémarrer et vérifier :&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
 # systemctl is-active hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Puis recharger la page du WebUI dans le navigateur (F5) : toutes les parties des réponses restent ouvertes, et le lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; a disparu.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Redémarrer le service coupe brièvement la session WebUI en cours (les conversations sont sauvegardées, mais la réponse en cours de rédaction peut être perdue). Faire le redémarrage à un moment calme.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retour en arrière :&#039;&#039;&#039; supprimer les deux lignes de &amp;lt;code&amp;gt;/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (ou le fichier CSS), puis relancer le service — le repli automatique revient.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résistance aux mises à jour :&#039;&#039;&#039; cette configuration survit aux mises à jour normales (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/opt/hermes-webui&amp;lt;/code&amp;gt; puis redémarrage) :&lt;br /&gt;
* &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; est listé dans le &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; du projet : git ne le touche jamais ;&lt;br /&gt;
* le CSS vit dans &amp;lt;code&amp;gt;~/.hermes/webui/extensions/&amp;lt;/code&amp;gt;, hors du dépôt git — c&#039;est le répertoire officiellement recommandé pour les extensions.&lt;br /&gt;
&lt;br /&gt;
Seuls une réinstallation complète (suppression + re-clone) ou un changement de nom des classes &amp;lt;code&amp;gt;interim-collapsed&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;interim-collapse-toggle&amp;lt;/code&amp;gt; côté développeur pourraient casser l&#039;extension. Si le repli revient tout seul après une mise à jour, il suffit de vérifier ces sélecteurs dans le CSS.&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SaerXNG et Firecrawl comme service secondaire afin de rester 100% local, il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/robbyczgw-cla/hermes-web-search-plus.git web-search-plus&lt;br /&gt;
&lt;br /&gt;
On choisit le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; afin de ne pas dépendre de services extérieurs ou payants :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
Entrer l&#039;adresse de son instance SearXNG :&lt;br /&gt;
 SearXNG key (SEARXNG_INSTANCE_URL, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Il n&#039;est pas obligatoire de renseigner une clé à l&#039;invite suivante :&lt;br /&gt;
 Keenable key (KEENABLE_API_KEY, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l&#039;autoriser explicitement :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 SEARXNG_INSTANCE_URL=&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 SEARXNG_ALLOW_PRIVATE=1&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour configurer Firecrawl, si une clef API est nécessaire il faut la renseigner dans le .env :&lt;br /&gt;
&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_KEY=&amp;lt;font color = blue&amp;gt;FIRECRAWL_API_KEY&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 configurer l&#039;instance Firecrawl, il faut modifier la configuration du plugin :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/plugins/web-search-plus/config.py&lt;br /&gt;
Et remplacer :&lt;br /&gt;
     &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
         &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.firecrawl.dev/v2/search&amp;quot;,&lt;br /&gt;
         &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
         &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
         &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
     },&lt;br /&gt;
Par (exemple avec http simple) :&lt;br /&gt;
    &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
        &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
        &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_FIRECRAW&amp;lt;/font&amp;gt;L:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;/v2/scrape&amp;quot;,&lt;br /&gt;
        &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
        &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
        &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
    },&lt;br /&gt;
L&#039;option suivante n&#039;est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
     &amp;quot;extract&amp;quot;: { &lt;br /&gt;
         # Target URLs supplied to extract_plus are blocked when they resolve to&lt;br /&gt;
         # private/internal networks. Operators can opt in for trusted intranet use.&lt;br /&gt;
         &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;True&amp;lt;/font&amp;gt;,&lt;br /&gt;
     },&lt;br /&gt;
&lt;br /&gt;
On teste ensuite le fonctionnement du plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins/web-search-plus&lt;br /&gt;
 # python3 search.py --query &amp;quot;Hermes Agent latest release&amp;quot; --provider auto --quality-report&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
&lt;br /&gt;
On installe Chromium :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install chromium&lt;br /&gt;
&lt;br /&gt;
On vérifie son fonctionnement :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
On ajoute le chemin du binaire DonSeTch à l&#039;environnement d&#039;Hermes :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
 DONSETCH_BIN=/root/.hermes/node/bin/donsetch&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite par défaut le routage automatique à SearXNG et Keenable. On réinitialise donc la configuration afin de repasser sur le profil &amp;lt;code&amp;gt;standard&amp;lt;/code&amp;gt;, puis on autorise Web Search Plus à utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On désactive les autres fournisseurs :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On réapplique les priorités de recherche et d&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On définit Keenable comme fournisseur de secours. Il s&#039;agit d&#039;un fournisseur extérieur disposant d&#039;un accès gratuit limité sans clé API :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
On autorise l&#039;utilisation automatique de DonSeTch :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Pour vérifier la configuration :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour remplacer les outils web natifs (non recommandée et partiellement fonctionnelle)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* (Optionnel) On désactive les outils web natifs de Hermes pour utiliser uniquement ceux du plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Et on ajoute dans la section &amp;lt;code&amp;gt;agent:&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;web&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour référence, aujourd&#039;hui intégrée nativement au plugin depuis la version 4.1.0&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Cette configuration permet de conserver les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes tout en remplaçant leur backend par Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Le modèle continue donc d&#039;utiliser les outils Web habituels de Hermes, mais les recherches et extractions sont transmises de manière transparente à Web Search Plus, qui applique ensuite sa propre configuration de routage vers DonSeTch, SearXNG, Firecrawl ou les autres providers activés.&lt;br /&gt;
&lt;br /&gt;
* Réactiver &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; dans la configuration d&#039;Hermes si nécessaire (supprimer &amp;lt;code&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;) :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Création d&#039;un provider Web pour remplacer de façon transparente les backends utilisés par les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes :&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/web/wsp&lt;br /&gt;
&lt;br /&gt;
On crée le fichier de métadonnées du plugin :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/plugin.yaml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 name: web-wsp&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 description: &amp;quot;Web Search Plus backend for Hermes native web_search/web_extract tools.&amp;quot;&lt;br /&gt;
 author: local&lt;br /&gt;
 kind: backend&lt;br /&gt;
 provides_web_providers:&lt;br /&gt;
   - wsp&lt;br /&gt;
&lt;br /&gt;
On crée ensuite le provider Web. Celui-ci sert d&#039;adaptateur entre les outils natifs de Hermes et Web Search Plus :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/__init__.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
import subprocess&lt;br /&gt;
import sys&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
from typing import Any, Dict, List&lt;br /&gt;
&lt;br /&gt;
from agent.web_search_provider import WebSearchProvider&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WSP_DIR = Path.home() / &amp;quot;.hermes&amp;quot; / &amp;quot;plugins&amp;quot; / &amp;quot;web-search-plus&amp;quot;&lt;br /&gt;
WSP_SEARCH = WSP_DIR / &amp;quot;search.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class WSPWebSearchProvider(WebSearchProvider):&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;wsp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def display_name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;Web Search Plus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def is_available(self) -&amp;gt; bool:&lt;br /&gt;
        return WSP_SEARCH.exists()&lt;br /&gt;
&lt;br /&gt;
    def supports_search(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def supports_extract(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def search(self, query: str, limit: int = 5) -&amp;gt; Dict[str, Any]:&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--query&amp;quot;,&lt;br /&gt;
            query,&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--max-results&amp;quot;,&lt;br /&gt;
            str(limit),&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus search failed: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: proc.stderr.strip() or &amp;quot;Web Search Plus search failed&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for i, item in enumerate(data.get(&amp;quot;results&amp;quot;, [])[:limit], start=1):&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;description&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;snippet&amp;quot;)&lt;br /&gt;
                        or item.get(&amp;quot;description&amp;quot;)&lt;br /&gt;
                        or &amp;quot;&amp;quot;&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;position&amp;quot;: i,&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return {&lt;br /&gt;
            &amp;quot;success&amp;quot;: True,&lt;br /&gt;
            &amp;quot;data&amp;quot;: {&lt;br /&gt;
                &amp;quot;web&amp;quot;: results,&lt;br /&gt;
            },&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    def extract(&lt;br /&gt;
        self,&lt;br /&gt;
        urls: List[str],&lt;br /&gt;
        format: str = &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        **kwargs: Any,&lt;br /&gt;
    ) -&amp;gt; List[Dict[str, Any]]:&lt;br /&gt;
&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--extract-urls&amp;quot;,&lt;br /&gt;
            *urls,&lt;br /&gt;
            &amp;quot;--format&amp;quot;,&lt;br /&gt;
            format or &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus extraction failed: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            error = (&lt;br /&gt;
                proc.stderr.strip()&lt;br /&gt;
                or &amp;quot;Web Search Plus extraction failed&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: error,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if data.get(&amp;quot;error&amp;quot;) and not data.get(&amp;quot;results&amp;quot;):&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: str(data[&amp;quot;error&amp;quot;]),&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for item in data.get(&amp;quot;results&amp;quot;, []):&lt;br /&gt;
            if not isinstance(item, dict):&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            content = str(&lt;br /&gt;
                item.get(&amp;quot;content&amp;quot;)&lt;br /&gt;
                or item.get(&amp;quot;markdown&amp;quot;)&lt;br /&gt;
                or &amp;quot;&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;content&amp;quot;: content,&lt;br /&gt;
                    &amp;quot;raw_content&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;raw_content&amp;quot;)&lt;br /&gt;
                        or content&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                        &amp;quot;provider&amp;quot;: data.get(&amp;quot;provider&amp;quot;),&lt;br /&gt;
                        &amp;quot;fetcher&amp;quot;: item.get(&amp;quot;fetcher&amp;quot;),&lt;br /&gt;
                        &amp;quot;status&amp;quot;: item.get(&amp;quot;status&amp;quot;),&lt;br /&gt;
                        &amp;quot;quality&amp;quot;: item.get(&amp;quot;quality&amp;quot;),&lt;br /&gt;
                        &amp;quot;lang&amp;quot;: item.get(&amp;quot;lang&amp;quot;),&lt;br /&gt;
                        &amp;quot;source_type&amp;quot;: item.get(&amp;quot;source_type&amp;quot;),&lt;br /&gt;
                        &amp;quot;page_type&amp;quot;: item.get(&amp;quot;page_type&amp;quot;),&lt;br /&gt;
                    },&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return results&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def register(ctx) -&amp;gt; None:&lt;br /&gt;
    ctx.register_web_search_provider(WSPWebSearchProvider())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le provider lance Web Search Plus dans un sous-processus distinct pour les recherches comme pour les extractions. Cela évite notamment les conflits entre les modules Python de Hermes et ceux de Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
On active ensuite le plugin :&lt;br /&gt;
 # hermes plugins enable web-wsp&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; à la demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
&lt;br /&gt;
Cette autorisation est nécessaire car le plugin fournit un backend susceptible d&#039;intercepter les appels effectués par les outils Web natifs de Hermes.&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&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;
&amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt; définit le backend Web général, tandis que &amp;lt;code&amp;gt;search_backend&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;extract_backend&amp;lt;/code&amp;gt; permettent de sélectionner explicitement des backends différents pour la recherche et l&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
Avec cette configuration, les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes restent inchangés pour le modèle, mais leurs appels sont transmis de façon transparente à Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On édite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après la mise à jour si celui-ci obtient un verdict &amp;lt;code&amp;gt;dangerous&amp;lt;/code&amp;gt;. Si le plugin est de nouveau désactivé, le réactiver manuellement :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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=5116</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5116"/>
		<updated>2026-10-24T14:05:31Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Hermes WebUI */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
=== Garder toutes les parties de réponse ouvertes (extension keep-expanded) ===&lt;br /&gt;
Par défaut, Hermes WebUI replie automatiquement les parties intermédiaires d&#039;une réponse (le texte que l&#039;IA écrit entre deux appels d&#039;outils) dès qu&#039;il y en a plus de 3 : un lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; apparaît pour les retrouver. Ce comportement est codé en dur (&amp;lt;code&amp;gt;INTERIM_COLLAPSE_THRESHOLD=3&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;static/messages.js&amp;lt;/code&amp;gt;) et ne propose aucune option. Les modèles qui produisent beaucoup de petites notes de progression (Qwen par exemple) le rendent vite pénible, car le bloc de code final peut se retrouver dans une partie repliée.&lt;br /&gt;
&lt;br /&gt;
Le WebUI supporte les extensions CSS (voir &amp;lt;code&amp;gt;docs/EXTENSIONS.md&amp;lt;/code&amp;gt; dans le dépôt). Voici une petite extension maison qui désactive ce repli.&lt;br /&gt;
&lt;br /&gt;
==== Étape 1 — Créer le fichier CSS ====&lt;br /&gt;
 # mkdir -p ~/.hermes/webui/extensions&lt;br /&gt;
 # vi ~/.hermes/webui/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
Y coller :&lt;br /&gt;
&lt;br /&gt;
 /* Extension hermes-webui : garder depliee chaque segment de reponse&lt;br /&gt;
    (desactive le repli automatique des notes intermediaires). */&lt;br /&gt;
 .interim-collapsed { display: revert !important; }&lt;br /&gt;
 .interim-collapse-toggle { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
==== Étape 2 — Déclarer l&#039;extension au service ====&lt;br /&gt;
Le service systemd lit déjà &amp;lt;code&amp;gt;EnvironmentFile=-/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (voir le service plus haut). On ajoute donc deux lignes :&lt;br /&gt;
&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_DIR=/root/.hermes/webui/extensions&lt;br /&gt;
 HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/keep-expanded.css&lt;br /&gt;
&lt;br /&gt;
==== Étape 3 — Redémarrer et vérifier ====&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
 # systemctl is-active hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Puis recharger la page du WebUI dans le navigateur (F5) : toutes les parties des réponses restent ouvertes, et le lien &amp;lt;code&amp;gt;Show N earlier updates&amp;lt;/code&amp;gt; a disparu.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Redémarrer le service coupe brièvement la session WebUI en cours (les conversations sont sauvegardées, mais la réponse en cours de rédaction peut être perdue). Faire le redémarrage à un moment calme.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Retour en arrière ====&lt;br /&gt;
Supprimer les deux lignes de &amp;lt;code&amp;gt;/opt/hermes-webui/.env&amp;lt;/code&amp;gt; (ou le fichier CSS), puis relancer le service : le repli automatique revient.&lt;br /&gt;
&lt;br /&gt;
==== Résistance aux mises à jour ====&lt;br /&gt;
Cette configuration survit aux mises à jour normales (&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/opt/hermes-webui&amp;lt;/code&amp;gt; puis redémarrage) :&lt;br /&gt;
* &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; est listé dans le &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; du projet : git ne le touche jamais ;&lt;br /&gt;
* le CSS vit dans &amp;lt;code&amp;gt;~/.hermes/webui/extensions/&amp;lt;/code&amp;gt;, hors du dépôt git — c&#039;est le répertoire officiellement recommandé pour les extensions.&lt;br /&gt;
&lt;br /&gt;
Seuls une réinstallation complète (suppression + re-clone) ou un changement de nom des classes &amp;lt;code&amp;gt;interim-collapsed&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;interim-collapse-toggle&amp;lt;/code&amp;gt; côté développeur pourraient casser l&#039;extension. Si le repli revient tout seul après une mise à jour, il suffit de vérifier ces sélecteurs dans le CSS.&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SaerXNG et Firecrawl comme service secondaire afin de rester 100% local, il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/robbyczgw-cla/hermes-web-search-plus.git web-search-plus&lt;br /&gt;
&lt;br /&gt;
On choisit le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; afin de ne pas dépendre de services extérieurs ou payants :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
Entrer l&#039;adresse de son instance SearXNG :&lt;br /&gt;
 SearXNG key (SEARXNG_INSTANCE_URL, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Il n&#039;est pas obligatoire de renseigner une clé à l&#039;invite suivante :&lt;br /&gt;
 Keenable key (KEENABLE_API_KEY, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l&#039;autoriser explicitement :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 SEARXNG_INSTANCE_URL=&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 SEARXNG_ALLOW_PRIVATE=1&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour configurer Firecrawl, si une clef API est nécessaire il faut la renseigner dans le .env :&lt;br /&gt;
&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_KEY=&amp;lt;font color = blue&amp;gt;FIRECRAWL_API_KEY&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 configurer l&#039;instance Firecrawl, il faut modifier la configuration du plugin :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/plugins/web-search-plus/config.py&lt;br /&gt;
Et remplacer :&lt;br /&gt;
     &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
         &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.firecrawl.dev/v2/search&amp;quot;,&lt;br /&gt;
         &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
         &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
         &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
     },&lt;br /&gt;
Par (exemple avec http simple) :&lt;br /&gt;
    &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
        &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
        &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_FIRECRAW&amp;lt;/font&amp;gt;L:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;/v2/scrape&amp;quot;,&lt;br /&gt;
        &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
        &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
        &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
    },&lt;br /&gt;
L&#039;option suivante n&#039;est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
     &amp;quot;extract&amp;quot;: { &lt;br /&gt;
         # Target URLs supplied to extract_plus are blocked when they resolve to&lt;br /&gt;
         # private/internal networks. Operators can opt in for trusted intranet use.&lt;br /&gt;
         &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;True&amp;lt;/font&amp;gt;,&lt;br /&gt;
     },&lt;br /&gt;
&lt;br /&gt;
On teste ensuite le fonctionnement du plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins/web-search-plus&lt;br /&gt;
 # python3 search.py --query &amp;quot;Hermes Agent latest release&amp;quot; --provider auto --quality-report&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
&lt;br /&gt;
On installe Chromium :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install chromium&lt;br /&gt;
&lt;br /&gt;
On vérifie son fonctionnement :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
On ajoute le chemin du binaire DonSeTch à l&#039;environnement d&#039;Hermes :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
 DONSETCH_BIN=/root/.hermes/node/bin/donsetch&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite par défaut le routage automatique à SearXNG et Keenable. On réinitialise donc la configuration afin de repasser sur le profil &amp;lt;code&amp;gt;standard&amp;lt;/code&amp;gt;, puis on autorise Web Search Plus à utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On désactive les autres fournisseurs :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On réapplique les priorités de recherche et d&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On définit Keenable comme fournisseur de secours. Il s&#039;agit d&#039;un fournisseur extérieur disposant d&#039;un accès gratuit limité sans clé API :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
On autorise l&#039;utilisation automatique de DonSeTch :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Pour vérifier la configuration :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour remplacer les outils web natifs (non recommandée et partiellement fonctionnelle)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* (Optionnel) On désactive les outils web natifs de Hermes pour utiliser uniquement ceux du plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Et on ajoute dans la section &amp;lt;code&amp;gt;agent:&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;web&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour référence, aujourd&#039;hui intégrée nativement au plugin depuis la version 4.1.0&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Cette configuration permet de conserver les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes tout en remplaçant leur backend par Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Le modèle continue donc d&#039;utiliser les outils Web habituels de Hermes, mais les recherches et extractions sont transmises de manière transparente à Web Search Plus, qui applique ensuite sa propre configuration de routage vers DonSeTch, SearXNG, Firecrawl ou les autres providers activés.&lt;br /&gt;
&lt;br /&gt;
* Réactiver &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; dans la configuration d&#039;Hermes si nécessaire (supprimer &amp;lt;code&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;) :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Création d&#039;un provider Web pour remplacer de façon transparente les backends utilisés par les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes :&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/web/wsp&lt;br /&gt;
&lt;br /&gt;
On crée le fichier de métadonnées du plugin :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/plugin.yaml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 name: web-wsp&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 description: &amp;quot;Web Search Plus backend for Hermes native web_search/web_extract tools.&amp;quot;&lt;br /&gt;
 author: local&lt;br /&gt;
 kind: backend&lt;br /&gt;
 provides_web_providers:&lt;br /&gt;
   - wsp&lt;br /&gt;
&lt;br /&gt;
On crée ensuite le provider Web. Celui-ci sert d&#039;adaptateur entre les outils natifs de Hermes et Web Search Plus :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/__init__.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
import subprocess&lt;br /&gt;
import sys&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
from typing import Any, Dict, List&lt;br /&gt;
&lt;br /&gt;
from agent.web_search_provider import WebSearchProvider&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WSP_DIR = Path.home() / &amp;quot;.hermes&amp;quot; / &amp;quot;plugins&amp;quot; / &amp;quot;web-search-plus&amp;quot;&lt;br /&gt;
WSP_SEARCH = WSP_DIR / &amp;quot;search.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class WSPWebSearchProvider(WebSearchProvider):&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;wsp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def display_name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;Web Search Plus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def is_available(self) -&amp;gt; bool:&lt;br /&gt;
        return WSP_SEARCH.exists()&lt;br /&gt;
&lt;br /&gt;
    def supports_search(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def supports_extract(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def search(self, query: str, limit: int = 5) -&amp;gt; Dict[str, Any]:&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--query&amp;quot;,&lt;br /&gt;
            query,&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--max-results&amp;quot;,&lt;br /&gt;
            str(limit),&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus search failed: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: proc.stderr.strip() or &amp;quot;Web Search Plus search failed&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for i, item in enumerate(data.get(&amp;quot;results&amp;quot;, [])[:limit], start=1):&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;description&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;snippet&amp;quot;)&lt;br /&gt;
                        or item.get(&amp;quot;description&amp;quot;)&lt;br /&gt;
                        or &amp;quot;&amp;quot;&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;position&amp;quot;: i,&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return {&lt;br /&gt;
            &amp;quot;success&amp;quot;: True,&lt;br /&gt;
            &amp;quot;data&amp;quot;: {&lt;br /&gt;
                &amp;quot;web&amp;quot;: results,&lt;br /&gt;
            },&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    def extract(&lt;br /&gt;
        self,&lt;br /&gt;
        urls: List[str],&lt;br /&gt;
        format: str = &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        **kwargs: Any,&lt;br /&gt;
    ) -&amp;gt; List[Dict[str, Any]]:&lt;br /&gt;
&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--extract-urls&amp;quot;,&lt;br /&gt;
            *urls,&lt;br /&gt;
            &amp;quot;--format&amp;quot;,&lt;br /&gt;
            format or &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus extraction failed: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            error = (&lt;br /&gt;
                proc.stderr.strip()&lt;br /&gt;
                or &amp;quot;Web Search Plus extraction failed&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: error,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if data.get(&amp;quot;error&amp;quot;) and not data.get(&amp;quot;results&amp;quot;):&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: str(data[&amp;quot;error&amp;quot;]),&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for item in data.get(&amp;quot;results&amp;quot;, []):&lt;br /&gt;
            if not isinstance(item, dict):&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            content = str(&lt;br /&gt;
                item.get(&amp;quot;content&amp;quot;)&lt;br /&gt;
                or item.get(&amp;quot;markdown&amp;quot;)&lt;br /&gt;
                or &amp;quot;&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;content&amp;quot;: content,&lt;br /&gt;
                    &amp;quot;raw_content&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;raw_content&amp;quot;)&lt;br /&gt;
                        or content&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                        &amp;quot;provider&amp;quot;: data.get(&amp;quot;provider&amp;quot;),&lt;br /&gt;
                        &amp;quot;fetcher&amp;quot;: item.get(&amp;quot;fetcher&amp;quot;),&lt;br /&gt;
                        &amp;quot;status&amp;quot;: item.get(&amp;quot;status&amp;quot;),&lt;br /&gt;
                        &amp;quot;quality&amp;quot;: item.get(&amp;quot;quality&amp;quot;),&lt;br /&gt;
                        &amp;quot;lang&amp;quot;: item.get(&amp;quot;lang&amp;quot;),&lt;br /&gt;
                        &amp;quot;source_type&amp;quot;: item.get(&amp;quot;source_type&amp;quot;),&lt;br /&gt;
                        &amp;quot;page_type&amp;quot;: item.get(&amp;quot;page_type&amp;quot;),&lt;br /&gt;
                    },&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return results&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def register(ctx) -&amp;gt; None:&lt;br /&gt;
    ctx.register_web_search_provider(WSPWebSearchProvider())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le provider lance Web Search Plus dans un sous-processus distinct pour les recherches comme pour les extractions. Cela évite notamment les conflits entre les modules Python de Hermes et ceux de Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
On active ensuite le plugin :&lt;br /&gt;
 # hermes plugins enable web-wsp&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; à la demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
&lt;br /&gt;
Cette autorisation est nécessaire car le plugin fournit un backend susceptible d&#039;intercepter les appels effectués par les outils Web natifs de Hermes.&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&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;
&amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt; définit le backend Web général, tandis que &amp;lt;code&amp;gt;search_backend&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;extract_backend&amp;lt;/code&amp;gt; permettent de sélectionner explicitement des backends différents pour la recherche et l&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
Avec cette configuration, les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes restent inchangés pour le modèle, mais leurs appels sont transmis de façon transparente à Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On édite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après la mise à jour si celui-ci obtient un verdict &amp;lt;code&amp;gt;dangerous&amp;lt;/code&amp;gt;. Si le plugin est de nouveau désactivé, le réactiver manuellement :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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=MediaWiki:Common.js&amp;diff=5115</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5115"/>
		<updated>2026-10-24T13:46:13Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Tout JavaScript present ici sera execute par tous les utilisateurs a chaque chargement de page. */&lt;br /&gt;
&lt;br /&gt;
/* ===== Fil d&#039;Ariane des tuiles dans l&#039;en-tete (skin Citizen) =====&lt;br /&gt;
   Affiche entre Accueil et Recherche UN rectangle noir avec le titre&lt;br /&gt;
   de la tuile la plus pertinente pour la page courante :&lt;br /&gt;
   0) page de provenance : chaque clic interne memorise la page ou l&#039;on&lt;br /&gt;
      etait (sessionStorage) ; si c&#039;est la cible d&#039;une tuile (ex. on&lt;br /&gt;
      arrive de RetroGaming), c&#039;est CETTE tuile qui est affichee.&lt;br /&gt;
      Le referrer sert de secours (bouton precedent, URL saisie).&lt;br /&gt;
   1) sinon si la page est elle-meme cible d&#039;une tuile : sa tuile&lt;br /&gt;
   2) sinon (sous-article) : parmi les hubs qui pointent vers la page,&lt;br /&gt;
      le seul dont le nom ressemble le plus a celui de la page.&lt;br /&gt;
   MediaWiki 1.45 : le module mediawiki.title n&#039;existe plus,&lt;br /&gt;
   mw.Title est fourni par mediawiki.api.&lt;br /&gt;
   Un MutationObserver re-insere la pastille si le skin reconstruit&lt;br /&gt;
   l&#039;en-tete apres l&#039;insertion. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	if ( mw.config.get( &#039;wgNamespaceNumber&#039; ) !== 0 ) return;&lt;br /&gt;
&lt;br /&gt;
	// Memorise la page de provenance a chaque clic sur un lien interne.&lt;br /&gt;
	document.addEventListener( &#039;click&#039;, function ( e ) {&lt;br /&gt;
		var a = e.target &amp;amp;&amp;amp; e.target.closest ? e.target.closest( &#039;a[href]&#039; ) : null;&lt;br /&gt;
		if ( !a ) return;&lt;br /&gt;
		try {&lt;br /&gt;
			var u = new URL( a.href, location.href );&lt;br /&gt;
			if ( u.hostname === location.hostname ) {&lt;br /&gt;
				sessionStorage.setItem( &#039;fil-ariane-precedente&#039;,&lt;br /&gt;
					location.pathname + location.search );&lt;br /&gt;
			}&lt;br /&gt;
		} catch ( err ) {}&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	var current = mw.config.get( &#039;wgPageName&#039; );&lt;br /&gt;
	if ( current === &#039;Accueil&#039; ) return;&lt;br /&gt;
&lt;br /&gt;
	function titreNormalise( nom ) {&lt;br /&gt;
		try { return new mw.Title( nom ).toText(); }&lt;br /&gt;
		catch ( e ) { return nom; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function similarite( a, b ) {&lt;br /&gt;
		var na = a.toLowerCase().replace( /_/g, &#039; &#039; ).split( /[^a-z0-9]+/ ).filter( Boolean );&lt;br /&gt;
		var nb = b.toLowerCase().replace( /_/g, &#039; &#039; ).split( /[^a-z0-9]+/ ).filter( Boolean );&lt;br /&gt;
		if ( !na.length || !nb.length ) return 0;&lt;br /&gt;
		var setB = {};&lt;br /&gt;
		nb.forEach( function ( t ) { setB[ t ] = 1; } );&lt;br /&gt;
		var commun = 0;&lt;br /&gt;
		na.forEach( function ( t ) { if ( setB[ t ] ) commun++; } );&lt;br /&gt;
		return commun / Math.max( na.length, nb.length );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function titreDepuisUrl( url ) {&lt;br /&gt;
		if ( !url ) return null;&lt;br /&gt;
		try {&lt;br /&gt;
			var u = new URL( url, location.origin );&lt;br /&gt;
			var t = u.searchParams.get( &#039;title&#039; );&lt;br /&gt;
			if ( !t ) {&lt;br /&gt;
				var m = u.pathname.match( /\/index\.php\/(.+)$/ );&lt;br /&gt;
				if ( m ) t = decodeURIComponent( m[ 1 ] );&lt;br /&gt;
			}&lt;br /&gt;
			if ( !t ) return null;&lt;br /&gt;
			return titreNormalise( t.replace( /#.*/, &#039;&#039; ) );&lt;br /&gt;
		} catch ( e ) { return null; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function pastilles( tuiles ) {&lt;br /&gt;
		function construire() {&lt;br /&gt;
			var zone = document.createElement( &#039;div&#039; );&lt;br /&gt;
			zone.className = &#039;tuile-fil-ariane citizen-header__item&#039;;&lt;br /&gt;
			tuiles.forEach( function ( t ) {&lt;br /&gt;
				var a = document.createElement( &#039;a&#039; );&lt;br /&gt;
				a.href = mw.util.getUrl( t.cible );&lt;br /&gt;
				a.className = &#039;tuile-pastille&#039;;&lt;br /&gt;
				a.title = &#039;Retour a la tuile : &#039; + t.titre;&lt;br /&gt;
				var span = document.createElement( &#039;span&#039; );&lt;br /&gt;
				span.textContent = t.titre;&lt;br /&gt;
				a.appendChild( span );&lt;br /&gt;
				zone.appendChild( a );&lt;br /&gt;
			} );&lt;br /&gt;
			return zone;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function verifier() {&lt;br /&gt;
			var header = document.querySelector( &#039;.citizen-header&#039; );&lt;br /&gt;
			if ( !header ) return;&lt;br /&gt;
			if ( header.querySelector( &#039;.tuile-fil-ariane&#039; ) ) return;&lt;br /&gt;
			var logo = header.querySelector( &#039;.citizen-header__logo&#039; );&lt;br /&gt;
			if ( !logo ) return;&lt;br /&gt;
			logo.insertAdjacentElement( &#039;afterend&#039;, construire() );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		verifier();&lt;br /&gt;
		// Le skin peut reconstruire l&#039;en-tete apres insertion : re-insere si besoin.&lt;br /&gt;
		var observer = new MutationObserver( verifier );&lt;br /&gt;
		observer.observe( document.body, { childList: true, subtree: true } );&lt;br /&gt;
		window.addEventListener( &#039;load&#039;, verifier );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function lancer() {&lt;br /&gt;
		var api = new mw.Api();&lt;br /&gt;
		var norm = titreNormalise( current );&lt;br /&gt;
		api.get( { action: &#039;parse&#039;, page: &#039;Accueil&#039;, prop: &#039;text&#039;, formatversion: 2 } )&lt;br /&gt;
		.then( function ( data ) {&lt;br /&gt;
			var doc = new DOMParser().parseFromString( data.parse.text, &#039;text/html&#039; );&lt;br /&gt;
			var tuiles = [];&lt;br /&gt;
			doc.querySelectorAll( &#039;.accueil-tile&#039; ).forEach( function ( el ) {&lt;br /&gt;
				var cible = el.getAttribute( &#039;data-cible&#039; );&lt;br /&gt;
				var cle = el.getAttribute( &#039;data-tuile&#039; );&lt;br /&gt;
				var titre = el.querySelector( &#039;.accueil-tile-title&#039; );&lt;br /&gt;
				if ( cible &amp;amp;&amp;amp; cle ) {&lt;br /&gt;
					tuiles.push( {&lt;br /&gt;
						cible: cible, key: cle,&lt;br /&gt;
						titre: titre ? titre.textContent.trim() : cle&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			function tuileDe( titreCible ) {&lt;br /&gt;
				var trouvees = tuiles.filter( function ( t ) {&lt;br /&gt;
					return titreNormalise( t.cible ) === titreCible;&lt;br /&gt;
				} );&lt;br /&gt;
				return trouvees.length ? trouvees[ 0 ] : null;&lt;br /&gt;
			}&lt;br /&gt;
			// 0) page de provenance (clic memorise, puis referrer en secours)&lt;br /&gt;
			var provenances = [&lt;br /&gt;
				titreDepuisUrl( sessionStorage.getItem( &#039;fil-ariane-precedente&#039; ) ),&lt;br /&gt;
				titreDepuisUrl( document.referrer )&lt;br /&gt;
			];&lt;br /&gt;
			for ( var i = 0; i &amp;lt; provenances.length; i++ ) {&lt;br /&gt;
				var ref = provenances[ i ];&lt;br /&gt;
				if ( ref &amp;amp;&amp;amp; ref !== norm ) {&lt;br /&gt;
					var tuileRef = tuileDe( ref );&lt;br /&gt;
					if ( tuileRef ) { pastilles( [ tuileRef ] ); return; }&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			// 1) la page courante EST la cible d&#039;une tuile&lt;br /&gt;
			var directe = tuileDe( norm );&lt;br /&gt;
			if ( directe ) { pastilles( [ directe ] ); return; }&lt;br /&gt;
			// 2) sous-article : hubs qui pointent vers la page courante&lt;br /&gt;
			return api.get( { action: &#039;query&#039;, list: &#039;backlinks&#039;, bltitle: norm,&lt;br /&gt;
				bllimit: 500, blnamespace: 0, formatversion: 2 } )&lt;br /&gt;
			.then( function ( bd ) {&lt;br /&gt;
				var liens = {};&lt;br /&gt;
				( bd.query.backlinks || [] ).forEach( function ( p ) {&lt;br /&gt;
					liens[ titreNormalise( p.title ) ] = 1;&lt;br /&gt;
				} );&lt;br /&gt;
				var candidats = tuiles.filter( function ( t ) {&lt;br /&gt;
					return liens[ titreNormalise( t.cible ) ];&lt;br /&gt;
				} );&lt;br /&gt;
				if ( !candidats.length ) return;&lt;br /&gt;
				// une seule pastille : le parent au nom le plus proche&lt;br /&gt;
				var best = candidats[ 0 ];&lt;br /&gt;
				var bestScore = -1;&lt;br /&gt;
				candidats.forEach( function ( t ) {&lt;br /&gt;
					var s = similarite( t.cible, current );&lt;br /&gt;
					if ( s &amp;gt; bestScore ) { bestScore = s; best = t; }&lt;br /&gt;
				} );&lt;br /&gt;
				pastilles( [ best ] );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function quandPret( fn ) {&lt;br /&gt;
		if ( document.readyState !== &#039;loading&#039; ) { fn(); }&lt;br /&gt;
		else { document.addEventListener( &#039;DOMContentLoaded&#039;, fn ); }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	quandPret( function () {&lt;br /&gt;
		mw.loader.using( [ &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039; ], lancer );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5114</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5114"/>
		<updated>2026-10-24T13:38:11Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Tout JavaScript present ici sera execute par tous les utilisateurs a chaque chargement de page. */&lt;br /&gt;
&lt;br /&gt;
/* ===== Fil d&#039;Ariane des tuiles dans l&#039;en-tete (skin Citizen) =====&lt;br /&gt;
   Affiche entre Accueil et Recherche un rectangle noir avec le titre&lt;br /&gt;
   de la/les tuile(s) qui contient(ent) la page courante&lt;br /&gt;
   (tuile directe ou tuile parente d&#039;un sous-article).&lt;br /&gt;
   MediaWiki 1.45 : le module mediawiki.title n&#039;existe plus,&lt;br /&gt;
   mw.Title est fourni par mediawiki.api.&lt;br /&gt;
   Un MutationObserver re-insere la pastille si le skin reconstruit&lt;br /&gt;
   l&#039;en-tete apres l&#039;insertion (sinon elle disparait a la navigation). */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	if ( mw.config.get( &#039;wgNamespaceNumber&#039; ) !== 0 ) return;&lt;br /&gt;
	var current = mw.config.get( &#039;wgPageName&#039; );&lt;br /&gt;
	if ( current === &#039;Accueil&#039; ) return;&lt;br /&gt;
&lt;br /&gt;
	function titreNormalise( nom ) {&lt;br /&gt;
		try { return new mw.Title( nom ).toText(); }&lt;br /&gt;
		catch ( e ) { return nom; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function similarite( a, b ) {&lt;br /&gt;
		var na = a.toLowerCase().replace( /_/g, &#039; &#039; ).split( /[^a-z0-9]+/ ).filter( Boolean );&lt;br /&gt;
		var nb = b.toLowerCase().replace( /_/g, &#039; &#039; ).split( /[^a-z0-9]+/ ).filter( Boolean );&lt;br /&gt;
		if ( !na.length || !nb.length ) return 0;&lt;br /&gt;
		var setB = {};&lt;br /&gt;
		nb.forEach( function ( t ) { setB[ t ] = 1; } );&lt;br /&gt;
		var commun = 0;&lt;br /&gt;
		na.forEach( function ( t ) { if ( setB[ t ] ) commun++; } );&lt;br /&gt;
		return commun / Math.max( na.length, nb.length );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function pageReferente() {&lt;br /&gt;
		if ( !document.referrer ) return null;&lt;br /&gt;
		try {&lt;br /&gt;
			var u = new URL( document.referrer );&lt;br /&gt;
			if ( u.hostname !== location.hostname ) return null;&lt;br /&gt;
			var t = u.searchParams.get( &#039;title&#039; );&lt;br /&gt;
			if ( !t ) {&lt;br /&gt;
				var m = u.pathname.match( /\/index\.php\/(.+)$/ );&lt;br /&gt;
				if ( m ) t = decodeURIComponent( m[ 1 ] );&lt;br /&gt;
			}&lt;br /&gt;
			if ( !t ) return null;&lt;br /&gt;
			return titreNormalise( t.replace( /#.*/, &#039;&#039; ) );&lt;br /&gt;
		} catch ( e ) { return null; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function pastilles( tuiles ) {&lt;br /&gt;
		function construire() {&lt;br /&gt;
			var zone = document.createElement( &#039;div&#039; );&lt;br /&gt;
			zone.className = &#039;tuile-fil-ariane citizen-header__item&#039;;&lt;br /&gt;
			tuiles.forEach( function ( t ) {&lt;br /&gt;
				var a = document.createElement( &#039;a&#039; );&lt;br /&gt;
				a.href = mw.util.getUrl( t.cible );&lt;br /&gt;
				a.className = &#039;tuile-pastille&#039;;&lt;br /&gt;
				a.title = &#039;Retour a la tuile : &#039; + t.titre;&lt;br /&gt;
				var span = document.createElement( &#039;span&#039; );&lt;br /&gt;
				span.textContent = t.titre;&lt;br /&gt;
				a.appendChild( span );&lt;br /&gt;
				zone.appendChild( a );&lt;br /&gt;
			} );&lt;br /&gt;
			return zone;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function verifier() {&lt;br /&gt;
			var header = document.querySelector( &#039;.citizen-header&#039; );&lt;br /&gt;
			if ( !header ) return;&lt;br /&gt;
			if ( header.querySelector( &#039;.tuile-fil-ariane&#039; ) ) return;&lt;br /&gt;
			var logo = header.querySelector( &#039;.citizen-header__logo&#039; );&lt;br /&gt;
			if ( !logo ) return;&lt;br /&gt;
			logo.insertAdjacentElement( &#039;afterend&#039;, construire() );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		verifier();&lt;br /&gt;
		// Le skin peut reconstruire l&#039;en-tete apres insertion : re-insere si besoin.&lt;br /&gt;
		var observer = new MutationObserver( verifier );&lt;br /&gt;
		observer.observe( document.body, { childList: true, subtree: true } );&lt;br /&gt;
		window.addEventListener( &#039;load&#039;, verifier );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function lancer() {&lt;br /&gt;
		var api = new mw.Api();&lt;br /&gt;
		var norm = titreNormalise( current );&lt;br /&gt;
		api.get( { action: &#039;parse&#039;, page: &#039;Accueil&#039;, prop: &#039;text&#039;, formatversion: 2 } )&lt;br /&gt;
		.then( function ( data ) {&lt;br /&gt;
			var doc = new DOMParser().parseFromString( data.parse.text, &#039;text/html&#039; );&lt;br /&gt;
			var tuiles = [];&lt;br /&gt;
			doc.querySelectorAll( &#039;.accueil-tile&#039; ).forEach( function ( el ) {&lt;br /&gt;
				var cible = el.getAttribute( &#039;data-cible&#039; );&lt;br /&gt;
				var cle = el.getAttribute( &#039;data-tuile&#039; );&lt;br /&gt;
				var titre = el.querySelector( &#039;.accueil-tile-title&#039; );&lt;br /&gt;
				if ( cible &amp;amp;&amp;amp; cle ) {&lt;br /&gt;
					tuiles.push( {&lt;br /&gt;
						cible: cible, key: cle,&lt;br /&gt;
						titre: titre ? titre.textContent.trim() : cle&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			function tuileDe( titreCible ) {&lt;br /&gt;
				var trouvees = tuiles.filter( function ( t ) {&lt;br /&gt;
					return titreNormalise( t.cible ) === titreCible;&lt;br /&gt;
				} );&lt;br /&gt;
				return trouvees.length ? trouvees[ 0 ] : null;&lt;br /&gt;
			}&lt;br /&gt;
			// 0) on arrive depuis une autre tuile : afficher la tuile d&#039;origine&lt;br /&gt;
			var ref = pageReferente();&lt;br /&gt;
			if ( ref &amp;amp;&amp;amp; ref !== norm ) {&lt;br /&gt;
				var tuileRef = tuileDe( ref );&lt;br /&gt;
				if ( tuileRef ) { pastilles( [ tuileRef ] ); return; }&lt;br /&gt;
			}&lt;br /&gt;
			// 1) la page courante EST la cible d&#039;une tuile&lt;br /&gt;
			var directe = tuileDe( norm );&lt;br /&gt;
			if ( directe ) { pastilles( [ directe ] ); return; }&lt;br /&gt;
			// 2) sous-article : hubs qui pointent vers la page courante&lt;br /&gt;
			return api.get( { action: &#039;query&#039;, list: &#039;backlinks&#039;, bltitle: norm,&lt;br /&gt;
				bllimit: 500, blnamespace: 0, formatversion: 2 } )&lt;br /&gt;
			.then( function ( bd ) {&lt;br /&gt;
				var liens = {};&lt;br /&gt;
				( bd.query.backlinks || [] ).forEach( function ( p ) {&lt;br /&gt;
					liens[ titreNormalise( p.title ) ] = 1;&lt;br /&gt;
				} );&lt;br /&gt;
				var candidats = tuiles.filter( function ( t ) {&lt;br /&gt;
					return liens[ titreNormalise( t.cible ) ];&lt;br /&gt;
				} );&lt;br /&gt;
				if ( !candidats.length ) return;&lt;br /&gt;
				// une seule pastille : le parent au nom le plus proche&lt;br /&gt;
				var best = candidats[ 0 ];&lt;br /&gt;
				var bestScore = -1;&lt;br /&gt;
				candidats.forEach( function ( t ) {&lt;br /&gt;
					var s = similarite( t.cible, current );&lt;br /&gt;
					if ( s &amp;gt; bestScore ) { bestScore = s; best = t; }&lt;br /&gt;
				} );&lt;br /&gt;
				pastilles( [ best ] );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function quandPret( fn ) {&lt;br /&gt;
		if ( document.readyState !== &#039;loading&#039; ) { fn(); }&lt;br /&gt;
		else { document.addEventListener( &#039;DOMContentLoaded&#039;, fn ); }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	quandPret( function () {&lt;br /&gt;
		mw.loader.using( [ &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039; ], lancer );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5113</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5113"/>
		<updated>2026-10-24T13:28:21Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Tout JavaScript present ici sera execute par tous les utilisateurs a chaque chargement de page. */&lt;br /&gt;
&lt;br /&gt;
/* ===== Fil d&#039;Ariane des tuiles dans l&#039;en-tete (skin Citizen) =====&lt;br /&gt;
   Affiche entre Accueil et Recherche UN rectangle noir avec le titre&lt;br /&gt;
   de la tuile qui contient la page courante :&lt;br /&gt;
   - tuile directe (la page est la cible de la tuile)&lt;br /&gt;
   - sinon, parmi les pages cibles qui pointent vers la page courante,&lt;br /&gt;
     la seule dont le nom ressemble le plus a celui de la page.&lt;br /&gt;
   MediaWiki 1.45 : le module mediawiki.title n&#039;existe plus,&lt;br /&gt;
   mw.Title est fourni par mediawiki.api.&lt;br /&gt;
   Un MutationObserver re-insere la pastille si le skin reconstruit&lt;br /&gt;
   l&#039;en-tete apres l&#039;insertion. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	if ( mw.config.get( &#039;wgNamespaceNumber&#039; ) !== 0 ) return;&lt;br /&gt;
	var current = mw.config.get( &#039;wgPageName&#039; );&lt;br /&gt;
	if ( current === &#039;Accueil&#039; ) return;&lt;br /&gt;
&lt;br /&gt;
	function titreNormalise( nom ) {&lt;br /&gt;
		try { return new mw.Title( nom ).toText(); }&lt;br /&gt;
		catch ( e ) { return nom; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function similarite( a, b ) {&lt;br /&gt;
		var na = a.toLowerCase().replace( /_/g, &#039; &#039; ).split( /[^a-z0-9]+/ ).filter( Boolean );&lt;br /&gt;
		var nb = b.toLowerCase().replace( /_/g, &#039; &#039; ).split( /[^a-z0-9]+/ ).filter( Boolean );&lt;br /&gt;
		if ( !na.length || !nb.length ) return 0;&lt;br /&gt;
		var setB = {};&lt;br /&gt;
		nb.forEach( function ( t ) { setB[ t ] = 1; } );&lt;br /&gt;
		var commun = 0;&lt;br /&gt;
		na.forEach( function ( t ) { if ( setB[ t ] ) commun++; } );&lt;br /&gt;
		return commun / Math.max( na.length, nb.length );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function pastilles( tuiles ) {&lt;br /&gt;
		function construire() {&lt;br /&gt;
			var zone = document.createElement( &#039;div&#039; );&lt;br /&gt;
			zone.className = &#039;tuile-fil-ariane citizen-header__item&#039;;&lt;br /&gt;
			tuiles.forEach( function ( t ) {&lt;br /&gt;
				var a = document.createElement( &#039;a&#039; );&lt;br /&gt;
				a.href = mw.util.getUrl( t.cible );&lt;br /&gt;
				a.className = &#039;tuile-pastille&#039;;&lt;br /&gt;
				a.title = &#039;Retour a la tuile : &#039; + t.titre;&lt;br /&gt;
				var span = document.createElement( &#039;span&#039; );&lt;br /&gt;
				span.textContent = t.titre;&lt;br /&gt;
				a.appendChild( span );&lt;br /&gt;
				zone.appendChild( a );&lt;br /&gt;
			} );&lt;br /&gt;
			return zone;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function verifier() {&lt;br /&gt;
			var header = document.querySelector( &#039;.citizen-header&#039; );&lt;br /&gt;
			if ( !header ) return;&lt;br /&gt;
			if ( header.querySelector( &#039;.tuile-fil-ariane&#039; ) ) return;&lt;br /&gt;
			var logo = header.querySelector( &#039;.citizen-header__logo&#039; );&lt;br /&gt;
			if ( !logo ) return;&lt;br /&gt;
			logo.insertAdjacentElement( &#039;afterend&#039;, construire() );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		verifier();&lt;br /&gt;
		// Le skin peut reconstruire l&#039;en-tete apres insertion : re-insere si besoin.&lt;br /&gt;
		var observer = new MutationObserver( verifier );&lt;br /&gt;
		observer.observe( document.body, { childList: true, subtree: true } );&lt;br /&gt;
		window.addEventListener( &#039;load&#039;, verifier );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function lancer() {&lt;br /&gt;
		var api = new mw.Api();&lt;br /&gt;
		var norm = titreNormalise( current );&lt;br /&gt;
		api.get( { action: &#039;parse&#039;, page: &#039;Accueil&#039;, prop: &#039;text&#039;, formatversion: 2 } )&lt;br /&gt;
		.then( function ( data ) {&lt;br /&gt;
			var doc = new DOMParser().parseFromString( data.parse.text, &#039;text/html&#039; );&lt;br /&gt;
			var tuiles = [];&lt;br /&gt;
			doc.querySelectorAll( &#039;.accueil-tile&#039; ).forEach( function ( el ) {&lt;br /&gt;
				var cible = el.getAttribute( &#039;data-cible&#039; );&lt;br /&gt;
				var cle = el.getAttribute( &#039;data-tuile&#039; );&lt;br /&gt;
				var titre = el.querySelector( &#039;.accueil-tile-title&#039; );&lt;br /&gt;
				if ( cible &amp;amp;&amp;amp; cle ) {&lt;br /&gt;
					tuiles.push( {&lt;br /&gt;
						cible: cible, key: cle,&lt;br /&gt;
						titre: titre ? titre.textContent.trim() : cle&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			// 1) la page courante EST la cible d&#039;une tuile : afficher cette tuile&lt;br /&gt;
			var directes = tuiles.filter( function ( t ) {&lt;br /&gt;
				return titreNormalise( t.cible ) === norm;&lt;br /&gt;
			} );&lt;br /&gt;
			if ( directes.length ) { pastilles( directes ); return; }&lt;br /&gt;
			// 2) sous-article : hubs qui pointent vers la page courante&lt;br /&gt;
			return api.get( { action: &#039;query&#039;, list: &#039;backlinks&#039;, bltitle: norm,&lt;br /&gt;
				bllimit: 500, blnamespace: 0, formatversion: 2 } )&lt;br /&gt;
			.then( function ( bd ) {&lt;br /&gt;
				var liens = {};&lt;br /&gt;
				( bd.query.backlinks || [] ).forEach( function ( p ) {&lt;br /&gt;
					liens[ titreNormalise( p.title ) ] = 1;&lt;br /&gt;
				} );&lt;br /&gt;
				var candidats = tuiles.filter( function ( t ) {&lt;br /&gt;
					return liens[ titreNormalise( t.cible ) ];&lt;br /&gt;
				} );&lt;br /&gt;
				if ( !candidats.length ) return;&lt;br /&gt;
				// une seule pastille : le parent au nom le plus proche&lt;br /&gt;
				var best = candidats[ 0 ];&lt;br /&gt;
				var bestScore = -1;&lt;br /&gt;
				candidats.forEach( function ( t ) {&lt;br /&gt;
					var s = similarite( t.cible, current );&lt;br /&gt;
					if ( s &amp;gt; bestScore ) { bestScore = s; best = t; }&lt;br /&gt;
				} );&lt;br /&gt;
				pastilles( [ best ] );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function quandPret( fn ) {&lt;br /&gt;
		if ( document.readyState !== &#039;loading&#039; ) { fn(); }&lt;br /&gt;
		else { document.addEventListener( &#039;DOMContentLoaded&#039;, fn ); }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	quandPret( function () {&lt;br /&gt;
		mw.loader.using( [ &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039; ], lancer );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5112</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5112"/>
		<updated>2026-10-24T12:48:49Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Tout JavaScript present ici sera execute par tous les utilisateurs a chaque chargement de page. */&lt;br /&gt;
&lt;br /&gt;
/* ===== Fil d&#039;Ariane des tuiles dans l&#039;en-tete (skin Citizen) =====&lt;br /&gt;
   Affiche entre Accueil et Recherche un rectangle noir avec le titre&lt;br /&gt;
   de la/les tuile(s) qui contient(ent) la page courante&lt;br /&gt;
   (tuile directe ou tuile parente d&#039;un sous-article).&lt;br /&gt;
   MediaWiki 1.45 : le module mediawiki.title n&#039;existe plus,&lt;br /&gt;
   mw.Title est fourni par mediawiki.api.&lt;br /&gt;
   Un MutationObserver re-insere la pastille si le skin reconstruit&lt;br /&gt;
   l&#039;en-tete apres l&#039;insertion (sinon elle disparait a la navigation). */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	if ( mw.config.get( &#039;wgNamespaceNumber&#039; ) !== 0 ) return;&lt;br /&gt;
	var current = mw.config.get( &#039;wgPageName&#039; );&lt;br /&gt;
	if ( current === &#039;Accueil&#039; ) return;&lt;br /&gt;
&lt;br /&gt;
	function titreNormalise( nom ) {&lt;br /&gt;
		try { return new mw.Title( nom ).toText(); }&lt;br /&gt;
		catch ( e ) { return nom; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function pastilles( tuiles ) {&lt;br /&gt;
		function construire() {&lt;br /&gt;
			var zone = document.createElement( &#039;div&#039; );&lt;br /&gt;
			zone.className = &#039;tuile-fil-ariane citizen-header__item&#039;;&lt;br /&gt;
			tuiles.forEach( function ( t ) {&lt;br /&gt;
				var a = document.createElement( &#039;a&#039; );&lt;br /&gt;
				a.href = mw.util.getUrl( t.cible );&lt;br /&gt;
				a.className = &#039;tuile-pastille&#039;;&lt;br /&gt;
				a.title = &#039;Retour a la tuile : &#039; + t.titre;&lt;br /&gt;
				var span = document.createElement( &#039;span&#039; );&lt;br /&gt;
				span.textContent = t.titre;&lt;br /&gt;
				a.appendChild( span );&lt;br /&gt;
				zone.appendChild( a );&lt;br /&gt;
			} );&lt;br /&gt;
			return zone;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function verifier() {&lt;br /&gt;
			var header = document.querySelector( &#039;.citizen-header&#039; );&lt;br /&gt;
			if ( !header ) return;&lt;br /&gt;
			if ( header.querySelector( &#039;.tuile-fil-ariane&#039; ) ) return;&lt;br /&gt;
			var logo = header.querySelector( &#039;.citizen-header__logo&#039; );&lt;br /&gt;
			if ( !logo ) return;&lt;br /&gt;
			logo.insertAdjacentElement( &#039;afterend&#039;, construire() );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		verifier();&lt;br /&gt;
		// Le skin peut reconstruire l&#039;en-tete apres insertion : re-insere si besoin.&lt;br /&gt;
		var observer = new MutationObserver( verifier );&lt;br /&gt;
		observer.observe( document.body, { childList: true, subtree: true } );&lt;br /&gt;
		window.addEventListener( &#039;load&#039;, verifier );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function lancer() {&lt;br /&gt;
		var api = new mw.Api();&lt;br /&gt;
		var norm = titreNormalise( current );&lt;br /&gt;
		api.get( { action: &#039;parse&#039;, page: &#039;Accueil&#039;, prop: &#039;text&#039;, formatversion: 2 } )&lt;br /&gt;
		.then( function ( data ) {&lt;br /&gt;
			var doc = new DOMParser().parseFromString( data.parse.text, &#039;text/html&#039; );&lt;br /&gt;
			var tuiles = [];&lt;br /&gt;
			doc.querySelectorAll( &#039;.accueil-tile&#039; ).forEach( function ( el ) {&lt;br /&gt;
				var cible = el.getAttribute( &#039;data-cible&#039; );&lt;br /&gt;
				var cle = el.getAttribute( &#039;data-tuile&#039; );&lt;br /&gt;
				var titre = el.querySelector( &#039;.accueil-tile-title&#039; );&lt;br /&gt;
				if ( cible &amp;amp;&amp;amp; cle ) {&lt;br /&gt;
					tuiles.push( {&lt;br /&gt;
						cible: cible, key: cle,&lt;br /&gt;
						titre: titre ? titre.textContent.trim() : cle&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			var trouvees = tuiles.filter( function ( t ) {&lt;br /&gt;
				return titreNormalise( t.cible ) === norm;&lt;br /&gt;
			} );&lt;br /&gt;
			return api.get( { action: &#039;query&#039;, list: &#039;backlinks&#039;, bltitle: norm,&lt;br /&gt;
				bllimit: 500, blnamespace: 0, formatversion: 2 } )&lt;br /&gt;
			.then( function ( bd ) {&lt;br /&gt;
				var liens = ( bd.query.backlinks || [] ).map( function ( p ) { return p.title; } );&lt;br /&gt;
				tuiles.forEach( function ( t ) {&lt;br /&gt;
					var cibleNorm = titreNormalise( t.cible );&lt;br /&gt;
					if ( cibleNorm !== norm &amp;amp;&amp;amp; liens.indexOf( cibleNorm ) !== -1 ) {&lt;br /&gt;
						trouvees.push( t );&lt;br /&gt;
					}&lt;br /&gt;
				} );&lt;br /&gt;
				if ( trouvees.length ) pastilles( trouvees );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function quandPret( fn ) {&lt;br /&gt;
		if ( document.readyState !== &#039;loading&#039; ) { fn(); }&lt;br /&gt;
		else { document.addEventListener( &#039;DOMContentLoaded&#039;, fn ); }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	quandPret( function () {&lt;br /&gt;
		mw.loader.using( [ &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039; ], lancer );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5111</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5111"/>
		<updated>2026-10-24T12:38:24Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Tout JavaScript present ici sera execute par tous les utilisateurs a chaque chargement de page. */&lt;br /&gt;
&lt;br /&gt;
/* ===== Fil d&#039;Ariane des tuiles dans l&#039;en-tete (skin Citizen) =====&lt;br /&gt;
   Affiche entre Accueil et Recherche un rectangle noir avec le titre&lt;br /&gt;
   de la/les tuile(s) qui contient(ent) la page courante&lt;br /&gt;
   (tuile directe ou tuile parente d&#039;un sous-article).&lt;br /&gt;
   MediaWiki 1.45 : le module mediawiki.title n&#039;existe plus,&lt;br /&gt;
   mw.Title est fourni par mediawiki.api. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	if ( mw.config.get( &#039;wgNamespaceNumber&#039; ) !== 0 ) return;&lt;br /&gt;
	var current = mw.config.get( &#039;wgPageName&#039; );&lt;br /&gt;
	if ( current === &#039;Accueil&#039; ) return;&lt;br /&gt;
&lt;br /&gt;
	function titreNormalise( nom ) {&lt;br /&gt;
		try { return new mw.Title( nom ).toText(); }&lt;br /&gt;
		catch ( e ) { return nom; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function pastilles( tuiles ) {&lt;br /&gt;
		var header = document.querySelector( &#039;.citizen-header&#039; );&lt;br /&gt;
		if ( !header ) return;&lt;br /&gt;
		var logo = header.querySelector( &#039;.citizen-header__logo&#039; );&lt;br /&gt;
		if ( !logo ) return;&lt;br /&gt;
		var zone = document.createElement( &#039;div&#039; );&lt;br /&gt;
		zone.className = &#039;tuile-fil-ariane citizen-header__item&#039;;&lt;br /&gt;
		tuiles.forEach( function ( t ) {&lt;br /&gt;
			var a = document.createElement( &#039;a&#039; );&lt;br /&gt;
			a.href = mw.util.getUrl( t.cible );&lt;br /&gt;
			a.className = &#039;tuile-pastille&#039;;&lt;br /&gt;
			a.title = &#039;Retour a la tuile : &#039; + t.titre;&lt;br /&gt;
			var span = document.createElement( &#039;span&#039; );&lt;br /&gt;
			span.textContent = t.titre;&lt;br /&gt;
			a.appendChild( span );&lt;br /&gt;
			zone.appendChild( a );&lt;br /&gt;
		} );&lt;br /&gt;
		logo.insertAdjacentElement( &#039;afterend&#039;, zone );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function lancer() {&lt;br /&gt;
		var api = new mw.Api();&lt;br /&gt;
		var norm = titreNormalise( current );&lt;br /&gt;
		api.get( { action: &#039;parse&#039;, page: &#039;Accueil&#039;, prop: &#039;text&#039;, formatversion: 2 } )&lt;br /&gt;
		.then( function ( data ) {&lt;br /&gt;
			var doc = new DOMParser().parseFromString( data.parse.text, &#039;text/html&#039; );&lt;br /&gt;
			var tuiles = [];&lt;br /&gt;
			doc.querySelectorAll( &#039;.accueil-tile&#039; ).forEach( function ( el ) {&lt;br /&gt;
				var cible = el.getAttribute( &#039;data-cible&#039; );&lt;br /&gt;
				var cle = el.getAttribute( &#039;data-tuile&#039; );&lt;br /&gt;
				var titre = el.querySelector( &#039;.accueil-tile-title&#039; );&lt;br /&gt;
				if ( cible &amp;amp;&amp;amp; cle ) {&lt;br /&gt;
					tuiles.push( {&lt;br /&gt;
						cible: cible, key: cle,&lt;br /&gt;
						titre: titre ? titre.textContent.trim() : cle&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			var trouvees = tuiles.filter( function ( t ) {&lt;br /&gt;
				return titreNormalise( t.cible ) === norm;&lt;br /&gt;
			} );&lt;br /&gt;
			return api.get( { action: &#039;query&#039;, list: &#039;backlinks&#039;, bltitle: norm,&lt;br /&gt;
				bllimit: 500, blnamespace: 0, formatversion: 2 } )&lt;br /&gt;
			.then( function ( bd ) {&lt;br /&gt;
				var liens = ( bd.query.backlinks || [] ).map( function ( p ) { return p.title; } );&lt;br /&gt;
				tuiles.forEach( function ( t ) {&lt;br /&gt;
					var cibleNorm = titreNormalise( t.cible );&lt;br /&gt;
					if ( cibleNorm !== norm &amp;amp;&amp;amp; liens.indexOf( cibleNorm ) !== -1 ) {&lt;br /&gt;
						trouvees.push( t );&lt;br /&gt;
					}&lt;br /&gt;
				} );&lt;br /&gt;
				if ( trouvees.length ) pastilles( trouvees );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function quandPret( fn ) {&lt;br /&gt;
		if ( document.readyState !== &#039;loading&#039; ) { fn(); }&lt;br /&gt;
		else { document.addEventListener( &#039;DOMContentLoaded&#039;, fn ); }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	quandPret( function () {&lt;br /&gt;
		mw.loader.using( [ &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039; ], lancer );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5110</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5110"/>
		<updated>2026-10-24T12:15:17Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Tout JavaScript présent ici sera exécuté par tous les utilisateurs à chaque chargement de page. */&lt;br /&gt;
&lt;br /&gt;
/* ===== Fil d&#039;Ariane des tuiles dans l&#039;en-tete (skin Citizen) =====&lt;br /&gt;
   Affiche entre Accueil et Recherche la/les tuile(s) qui contient(ent)&lt;br /&gt;
   la page courante (tuile directe ou tuile parente d&#039;un sous-article).&lt;br /&gt;
   Version sans jQuery, compatible MediaWiki 1.45. */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	if ( mw.config.get( &#039;wgNamespaceNumber&#039; ) !== 0 ) return;&lt;br /&gt;
	var current = mw.config.get( &#039;wgPageName&#039; );&lt;br /&gt;
	if ( current === &#039;Accueil&#039; ) return;&lt;br /&gt;
&lt;br /&gt;
	function pastilles( tuiles ) {&lt;br /&gt;
		var header = document.querySelector( &#039;.citizen-header&#039; );&lt;br /&gt;
		if ( !header ) return;&lt;br /&gt;
		var logo = header.querySelector( &#039;.citizen-header__logo&#039; );&lt;br /&gt;
		if ( !logo ) return;&lt;br /&gt;
		var zone = document.createElement( &#039;div&#039; );&lt;br /&gt;
		zone.className = &#039;tuile-fil-ariane citizen-header__item&#039;;&lt;br /&gt;
		tuiles.forEach( function ( t ) {&lt;br /&gt;
			var a = document.createElement( &#039;a&#039; );&lt;br /&gt;
			a.href = mw.util.getUrl( t.cible );&lt;br /&gt;
			a.className = &#039;tuile-pastille&#039;;&lt;br /&gt;
			a.title = &#039;Retour a la tuile : &#039; + t.titre;&lt;br /&gt;
			var img = document.createElement( &#039;img&#039; );&lt;br /&gt;
			img.src = mw.util.wikiScript() + &#039;?title=Special:FilePath&amp;amp;file=&#039; +&lt;br /&gt;
				encodeURIComponent( &#039;Tuile &#039; + t.key + &#039;.webp&#039; ) + &#039;&amp;amp;width=44&#039;;&lt;br /&gt;
			img.alt = &#039;&#039;;&lt;br /&gt;
			var span = document.createElement( &#039;span&#039; );&lt;br /&gt;
			span.textContent = t.titre;&lt;br /&gt;
			a.appendChild( img );&lt;br /&gt;
			a.appendChild( span );&lt;br /&gt;
			zone.appendChild( a );&lt;br /&gt;
		} );&lt;br /&gt;
		logo.insertAdjacentElement( &#039;afterend&#039;, zone );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function lancer() {&lt;br /&gt;
		var api = new mw.Api();&lt;br /&gt;
		var norm = mw.title.new( current ).prefixedText;&lt;br /&gt;
		api.get( { action: &#039;parse&#039;, page: &#039;Accueil&#039;, prop: &#039;text&#039;, formatversion: 2 } )&lt;br /&gt;
		.then( function ( data ) {&lt;br /&gt;
			var doc = new DOMParser().parseFromString( data.parse.text, &#039;text/html&#039; );&lt;br /&gt;
			var tuiles = [];&lt;br /&gt;
			doc.querySelectorAll( &#039;.accueil-tile&#039; ).forEach( function ( el ) {&lt;br /&gt;
				var cible = el.getAttribute( &#039;data-cible&#039; );&lt;br /&gt;
				var cle = el.getAttribute( &#039;data-tuile&#039; );&lt;br /&gt;
				var titre = el.querySelector( &#039;.accueil-tile-title&#039; );&lt;br /&gt;
				if ( cible &amp;amp;&amp;amp; cle ) {&lt;br /&gt;
					tuiles.push( {&lt;br /&gt;
						cible: cible, key: cle,&lt;br /&gt;
						titre: titre ? titre.textContent.trim() : cle&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			var trouvees = tuiles.filter( function ( t ) {&lt;br /&gt;
				return mw.title.new( t.cible ).prefixedText === norm;&lt;br /&gt;
			} );&lt;br /&gt;
			return api.get( { action: &#039;query&#039;, list: &#039;backlinks&#039;, bltitle: norm,&lt;br /&gt;
				bllimit: 500, blnamespace: 0, formatversion: 2 } )&lt;br /&gt;
			.then( function ( bd ) {&lt;br /&gt;
				var liens = ( bd.query.backlinks || [] ).map( function ( p ) { return p.title; } );&lt;br /&gt;
				tuiles.forEach( function ( t ) {&lt;br /&gt;
					var cibleNorm = mw.title.new( t.cible ).prefixedText;&lt;br /&gt;
					if ( cibleNorm !== norm &amp;amp;&amp;amp; liens.indexOf( cibleNorm ) !== -1 ) {&lt;br /&gt;
						trouvees.push( t );&lt;br /&gt;
					}&lt;br /&gt;
				} );&lt;br /&gt;
				if ( trouvees.length ) pastilles( trouvees );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function quandPret( fn ) {&lt;br /&gt;
		if ( document.readyState !== &#039;loading&#039; ) { fn(); }&lt;br /&gt;
		else { document.addEventListener( &#039;DOMContentLoaded&#039;, fn ); }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	quandPret( function () {&lt;br /&gt;
		mw.loader.using( [ &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039;, &#039;mediawiki.title&#039; ], lancer );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5109</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5109"/>
		<updated>2026-10-24T11:59:53Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Tout JavaScript présent ici sera exécuté par tous les utilisateurs à chaque chargement de page. */&lt;br /&gt;
&lt;br /&gt;
/* ===== Fil d&#039;Ariane des tuiles dans l&#039;en-tete (skin Citizen) =====&lt;br /&gt;
   Affiche entre Accueil et Recherche la/les tuile(s) qui contient(ent)&lt;br /&gt;
   la page courante (tuile directe ou tuile parente d&#039;un sous-article). */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	if ( mw.config.get( &#039;wgNamespaceNumber&#039; ) !== 0 ) return;&lt;br /&gt;
	var current = mw.config.get( &#039;wgPageName&#039; );&lt;br /&gt;
	if ( current === &#039;Accueil&#039; ) return;&lt;br /&gt;
&lt;br /&gt;
	function pastilles( tuiles ) {&lt;br /&gt;
		var header = document.querySelector( &#039;.citizen-header&#039; );&lt;br /&gt;
		if ( !header ) return;&lt;br /&gt;
		var logo = header.querySelector( &#039;.citizen-header__logo&#039; );&lt;br /&gt;
		if ( !logo ) return;&lt;br /&gt;
		var zone = document.createElement( &#039;div&#039; );&lt;br /&gt;
		zone.className = &#039;tuile-fil-ariane citizen-header__item&#039;;&lt;br /&gt;
		tuiles.forEach( function ( t ) {&lt;br /&gt;
			var a = document.createElement( &#039;a&#039; );&lt;br /&gt;
			a.href = mw.util.getUrl( t.cible );&lt;br /&gt;
			a.className = &#039;tuile-pastille&#039;;&lt;br /&gt;
			a.title = &#039;Retour a la tuile : &#039; + t.titre;&lt;br /&gt;
			var img = document.createElement( &#039;img&#039; );&lt;br /&gt;
			img.src = mw.util.wikiScript() + &#039;?title=Special:FilePath&amp;amp;file=&#039; +&lt;br /&gt;
				encodeURIComponent( &#039;Tuile &#039; + t.key + &#039;.webp&#039; ) + &#039;&amp;amp;width=44&#039;;&lt;br /&gt;
			img.alt = &#039;&#039;;&lt;br /&gt;
			var span = document.createElement( &#039;span&#039; );&lt;br /&gt;
			span.textContent = t.titre;&lt;br /&gt;
			a.appendChild( img );&lt;br /&gt;
			a.appendChild( span );&lt;br /&gt;
			zone.appendChild( a );&lt;br /&gt;
		} );&lt;br /&gt;
		logo.insertAdjacentElement( &#039;afterend&#039;, zone );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function lancer() {&lt;br /&gt;
		var api = new mw.Api();&lt;br /&gt;
		var norm = mw.title.new( current ).prefixedText;&lt;br /&gt;
		api.get( { action: &#039;parse&#039;, page: &#039;Accueil&#039;, prop: &#039;text&#039;, formatversion: 2 } )&lt;br /&gt;
		.then( function ( data ) {&lt;br /&gt;
			var doc = new DOMParser().parseFromString( data.parse.text, &#039;text/html&#039; );&lt;br /&gt;
			var tuiles = [];&lt;br /&gt;
			doc.querySelectorAll( &#039;.accueil-tile&#039; ).forEach( function ( el ) {&lt;br /&gt;
				var cible = el.getAttribute( &#039;data-cible&#039; );&lt;br /&gt;
				var cle = el.getAttribute( &#039;data-tuile&#039; );&lt;br /&gt;
				var titre = el.querySelector( &#039;.accueil-tile-title&#039; );&lt;br /&gt;
				if ( cible &amp;amp;&amp;amp; cle ) {&lt;br /&gt;
					tuiles.push( {&lt;br /&gt;
						cible: cible, key: cle,&lt;br /&gt;
						titre: titre ? titre.textContent.trim() : cle&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			var trouvees = tuiles.filter( function ( t ) {&lt;br /&gt;
				return mw.title.new( t.cible ).prefixedText === norm;&lt;br /&gt;
			} );&lt;br /&gt;
			return api.get( { action: &#039;query&#039;, list: &#039;backlinks&#039;, bltitle: norm,&lt;br /&gt;
				bllimit: 500, blnamespace: 0, formatversion: 2 } )&lt;br /&gt;
			.then( function ( bd ) {&lt;br /&gt;
				var liens = ( bd.query.backlinks || [] ).map( function ( p ) { return p.title; } );&lt;br /&gt;
				tuiles.forEach( function ( t ) {&lt;br /&gt;
					var cibleNorm = mw.title.new( t.cible ).prefixedText;&lt;br /&gt;
					if ( cibleNorm !== norm &amp;amp;&amp;amp; liens.indexOf( cibleNorm ) !== -1 ) {&lt;br /&gt;
						trouvees.push( t );&lt;br /&gt;
					}&lt;br /&gt;
				} );&lt;br /&gt;
				if ( trouvees.length ) pastilles( trouvees );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$( lancer );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Citizen.css&amp;diff=5108</id>
		<title>MediaWiki:Citizen.css</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Citizen.css&amp;diff=5108"/>
		<updated>2026-10-24T11:51:14Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* La totalité du CSS placé ici s&#039;appliquera aux utilisateurs de l&#039;habillage Citizen. */&lt;br /&gt;
/* Cache le bouton des reading preferences de Citizen */&lt;br /&gt;
.citizen-dropdown-summary[aria-details=&amp;quot;citizen-preferences-dropdown__card&amp;quot;] {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* couleur du site.. */&lt;br /&gt;
:root.skin-theme-clientpref-day {&lt;br /&gt;
  --color-progressive-oklch__h: 250;&lt;br /&gt;
  --color-progressive-oklch__c: 0.20;&lt;br /&gt;
  --color-progressive-oklch__l: 50%;&lt;br /&gt;
&lt;br /&gt;
  --color-surface-0: #f3f4f6; /* fond général */&lt;br /&gt;
  --color-surface-1: #dcdfe4; /* bas de page */&lt;br /&gt;
  --color-surface-2: #dcdfe4; /* bloc édition */&lt;br /&gt;
  --color-surface-3: #dcdfe4; /* jaune   d1d5db; inconnu */&lt;br /&gt;
  --color-surface-4: #dcdfe4; /* orange   c4c9d1; inconnu */&lt;br /&gt;
&lt;br /&gt;
  --color-base: #2f3440;&lt;br /&gt;
  --color-emphasized: #111827;&lt;br /&gt;
  --color-subtle: #6b7280;&lt;br /&gt;
  --color-link: #0969da;&lt;br /&gt;
}&lt;br /&gt;
/* Fond de la barre sticky Citizen */&lt;br /&gt;
.skin-citizen .citizen-sticky-header-background {&lt;br /&gt;
  background-color: #dcdfe4!important;&lt;br /&gt;
}&lt;br /&gt;
/* Liens vers pages inexistantes */&lt;br /&gt;
.skin-citizen a.new,&lt;br /&gt;
.skin-citizen .mw-parser-output a.new {&lt;br /&gt;
  color: #b4232a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Liens vers pages inexistantes au survol */&lt;br /&gt;
.skin-citizen a.new:hover,&lt;br /&gt;
.skin-citizen .mw-parser-output a.new:hover {&lt;br /&gt;
  color: #8f1d24;&lt;br /&gt;
}&lt;br /&gt;
/* couleur code et pre façon terminal */&lt;br /&gt;
pre,&lt;br /&gt;
code,&lt;br /&gt;
.mw-code {&lt;br /&gt;
  background: #161b22;&lt;br /&gt;
  color: #e6edf3;&lt;br /&gt;
  border: 1px solid #30363d;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  font-family: &amp;quot;SFMono-Regular&amp;quot;, &amp;quot;Consolas&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, monospace;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre {&lt;br /&gt;
  padding: 14px 16px;&lt;br /&gt;
  overflow-x: auto;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
code {&lt;br /&gt;
  padding: 0.15em 0.4em;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
/* Citizen menus/panneaux gris clair */&lt;br /&gt;
.skin-citizen .citizen-menu__card,&lt;br /&gt;
.skin-citizen .citizen-menu__card-content,&lt;br /&gt;
.skin-citizen .citizen-userInfo,&lt;br /&gt;
.skin-citizen .citizen-command-palette,&lt;br /&gt;
.skin-citizen .citizen-command-palette-header,&lt;br /&gt;
.skin-citizen .citizen-command-palette-empty-state,&lt;br /&gt;
.skin-citizen .citizen-command-palette__footer {&lt;br /&gt;
  background-color: #dcdfe4 !important;&lt;br /&gt;
  color: #2f3440 !important;&lt;br /&gt;
  border-color: #c4c9d1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen .citizen-menu__content a,&lt;br /&gt;
.skin-citizen .citizen-userInfo a {&lt;br /&gt;
  color: #2f3440 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen .citizen-menu__content a:hover,&lt;br /&gt;
.skin-citizen .citizen-userInfo a:hover {&lt;br /&gt;
  background-color: #d1d5db !important;&lt;br /&gt;
  color: #111827 !important;&lt;br /&gt;
}&lt;br /&gt;
/* Barre du haut Citizen en sombre */&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header,&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header .citizen-header__inner,&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header .citizen-header__logo {&lt;br /&gt;
  background-color: #111827 !important;&lt;br /&gt;
  color: #f9fafb !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Icônes et boutons visibles directement dans la barre du haut */&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header &amp;gt; .citizen-header__logo .cdx-button,&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header &amp;gt; .citizen-header__logo svg,&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header &amp;gt; .citizen-header__logo .citizen-ui-icon,&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header &amp;gt; .citizen-header__item &amp;gt; .citizen-dropdown-details &amp;gt; .citizen-dropdown-summary,&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header .citizen-header__end &amp;gt; .citizen-header__item &amp;gt; .citizen-dropdown-details &amp;gt; .citizen-dropdown-summary {&lt;br /&gt;
  color: #f9fafb !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Survol uniquement des boutons de la barre du haut */&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header &amp;gt; .citizen-header__logo .cdx-button:hover,&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header &amp;gt; .citizen-header__item &amp;gt; .citizen-dropdown-details &amp;gt; .citizen-dropdown-summary:hover,&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header .citizen-header__end &amp;gt; .citizen-header__item &amp;gt; .citizen-dropdown-details &amp;gt; .citizen-dropdown-summary:hover {&lt;br /&gt;
  background-color: #1f2937 !important;&lt;br /&gt;
  color: #ffffff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inverse uniquement le petit logo de la barre du haut */&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header .citizen-header__logo &amp;gt; a &amp;gt; .mw-logo-icon {&lt;br /&gt;
  filter: invert(1) brightness(1.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sécurité : logos dans le drawer/menu utilisateur restent normaux */&lt;br /&gt;
.skin-citizen .citizen-drawer__logo .mw-logo-icon,&lt;br /&gt;
.skin-citizen .citizen-menu__card .mw-logo-icon {&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* Boutons principaux : noir + blanc */&lt;br /&gt;
.skin-citizen .cdx-button--action-progressive.cdx-button--weight-primary,&lt;br /&gt;
.skin-citizen .oo-ui-flaggedElement-progressive.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {&lt;br /&gt;
  background-color: #111827 !important;&lt;br /&gt;
  border-color: #111827 !important;&lt;br /&gt;
  color: #f9fafb !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Icônes des boutons principaux */&lt;br /&gt;
.skin-citizen .cdx-button--action-progressive.cdx-button--weight-primary .citizen-ui-icon {&lt;br /&gt;
  color: #f9fafb !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Survol inversé : blanc + noir */&lt;br /&gt;
.skin-citizen .cdx-button--action-progressive.cdx-button--weight-primary:hover,&lt;br /&gt;
.skin-citizen .oo-ui-flaggedElement-progressive.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button:hover {&lt;br /&gt;
  background-color: #f9fafb !important;&lt;br /&gt;
  border-color: #111827 !important;&lt;br /&gt;
  color: #111827 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Icônes au survol */&lt;br /&gt;
.skin-citizen .cdx-button--action-progressive.cdx-button--weight-primary:hover .citizen-ui-icon {&lt;br /&gt;
  color: #111827 !important;&lt;br /&gt;
}&lt;br /&gt;
/* Survol général des boutons discrets */&lt;br /&gt;
.skin-citizen .cdx-button--weight-quiet:hover {&lt;br /&gt;
  background-color: #d1d5db !important;&lt;br /&gt;
  color: #111827 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Exception : barre du haut sombre */&lt;br /&gt;
.skin-citizen &amp;gt; .citizen-header .cdx-button--weight-quiet:hover {&lt;br /&gt;
  background-color: #d1d5db !important;&lt;br /&gt;
  color: #ffffff !important;&lt;br /&gt;
}&lt;br /&gt;
/* Zone d&#039;édition du wikicode */&lt;br /&gt;
.skin-citizen #wpTextbox1 {&lt;br /&gt;
  background-color: #f9fafb !important;&lt;br /&gt;
  color: #111827 !important;&lt;br /&gt;
  border: 1px solid #c4c9d1 !important;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 12px;&lt;br /&gt;
}&lt;br /&gt;
/* Images et médias responsive dans le contenu des pages */&lt;br /&gt;
.skin-citizen .mw-parser-output img,&lt;br /&gt;
.skin-citizen .mw-parser-output video,&lt;br /&gt;
.skin-citizen .mw-parser-output svg {&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Miniatures MediaWiki responsive */&lt;br /&gt;
.skin-citizen .mw-parser-output .thumb,&lt;br /&gt;
.skin-citizen .mw-parser-output .thumbinner {&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen .mw-parser-output .thumb img {&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Bandeau de la page d&#039;accueil */&lt;br /&gt;
.accueil-bandeau,&lt;br /&gt;
.accueil-tiles {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  max-width: 1000px;&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  margin-right: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-bandeau {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin-top: 1rem;&lt;br /&gt;
  margin-bottom: 2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-bandeau img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  border-radius: 16px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Grille de tuiles de la page d&#039;accueil */&lt;br /&gt;
.accueil-tiles {&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(4, 1fr);&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  margin-top: 1.5rem;&lt;br /&gt;
  margin-bottom: 2rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tuile générale */&lt;br /&gt;
.accueil-tile {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  height: 100px;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
  border-radius: 16px;&lt;br /&gt;
  background: #111827;&lt;br /&gt;
  border: 1px solid #c4c9d1;&lt;br /&gt;
  box-shadow: 0 8px 20px rgba(15, 23, 42, 0.12);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Grande tuile sur toute la largeur */&lt;br /&gt;
.accueil-tile-large {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  height: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Correction image MediaWiki : div &amp;gt; p &amp;gt; span &amp;gt; a &amp;gt; img */&lt;br /&gt;
.accueil-tile &amp;gt; p {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  line-height: 0;&lt;br /&gt;
  font-size: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-tile &amp;gt; p &amp;gt; span,&lt;br /&gt;
.accueil-tile &amp;gt; p &amp;gt; span &amp;gt; a {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: 100%;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  line-height: 0;&lt;br /&gt;
  font-size: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-tile &amp;gt; p &amp;gt; span &amp;gt; a &amp;gt; img.mw-file-element {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  height: 100% !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Voile sombre pour lisibilité */&lt;br /&gt;
.accueil-tile::after {&lt;br /&gt;
  content: &amp;quot;&amp;quot;;&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  background:&lt;br /&gt;
    linear-gradient(&lt;br /&gt;
      to bottom,&lt;br /&gt;
      rgba(17, 24, 39, 0.10),&lt;br /&gt;
      rgba(17, 24, 39, 0.72)&lt;br /&gt;
    );&lt;br /&gt;
  z-index: 1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Texte par-dessus */&lt;br /&gt;
.accueil-tile-content {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 1rem;&lt;br /&gt;
  right: 1rem;&lt;br /&gt;
  top: 50%;&lt;br /&gt;
  transform: translateY(-50%);&lt;br /&gt;
  z-index: 2;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-tile-title {&lt;br /&gt;
  font-size: 1.35rem;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  line-height: 1.1;&lt;br /&gt;
  color: #ffffff;&lt;br /&gt;
  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.65);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-tile-desc {&lt;br /&gt;
  margin-top: 0.35rem;&lt;br /&gt;
  font-size: 0.9rem;&lt;br /&gt;
  line-height: 1.25;&lt;br /&gt;
  color: #e5e7eb;&lt;br /&gt;
  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.65);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Grande tuile : texte plus gros */&lt;br /&gt;
.accueil-tile-large .accueil-tile-title {&lt;br /&gt;
  font-size: 1.9rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-tile-large .accueil-tile-desc {&lt;br /&gt;
  font-size: 1rem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Effet au survol */&lt;br /&gt;
.accueil-tile {&lt;br /&gt;
  transition: background-color 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-tile:hover {&lt;br /&gt;
  background: #6b7280;&lt;br /&gt;
  border-color: #111827;&lt;br /&gt;
  box-shadow: 0 10px 24px rgba(15, 23, 42, 0.18);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Couleurs personnalisées par tuile */&lt;br /&gt;
.accueil-tile-proxmox .accueil-tile-title {&lt;br /&gt;
  color: #f97316;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-tile-linux .accueil-tile-title {&lt;br /&gt;
  color: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.accueil-tile-ia .accueil-tile-title {&lt;br /&gt;
  color: #c084fc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Responsive tablette */&lt;br /&gt;
@media screen and (max-width: 1000px) {&lt;br /&gt;
  .accueil-tiles {&lt;br /&gt;
    grid-template-columns: repeat(2, 1fr);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .accueil-tile-large {&lt;br /&gt;
    grid-column: 1 / -1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Responsive mobile */&lt;br /&gt;
@media screen and (max-width: 640px) {&lt;br /&gt;
  .accueil-tiles {&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    gap: 0.85rem;&lt;br /&gt;
    margin: 1rem auto 1.5rem auto;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .accueil-tile,&lt;br /&gt;
  .accueil-tile-large {&lt;br /&gt;
    grid-column: 1 / -1;&lt;br /&gt;
    height: 135px;&lt;br /&gt;
    border-radius: 12px;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .accueil-tile-content {&lt;br /&gt;
    left: 0.85rem;&lt;br /&gt;
    right: 0.85rem;&lt;br /&gt;
    bottom: 0.75rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .accueil-tile-title,&lt;br /&gt;
  .accueil-tile-large .accueil-tile-title {&lt;br /&gt;
    font-size: 1.25rem;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .accueil-tile-desc,&lt;br /&gt;
  .accueil-tile-large .accueil-tile-desc {&lt;br /&gt;
    font-size: 0.82rem;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fil d&#039;Ariane des tuiles dans l&#039;en-tete */&lt;br /&gt;
.tuile-fil-ariane {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.4rem;&lt;br /&gt;
  margin-left: 0.5rem;&lt;br /&gt;
  overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tuile-pastille {&lt;br /&gt;
  display: inline-flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 0.45rem;&lt;br /&gt;
  background: #111827;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  border: 1px solid #c4c9d1;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.25rem 0.7rem;&lt;br /&gt;
  font-size: 0.85rem;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  line-height: 1;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tuile-pastille:hover {&lt;br /&gt;
  background: #374151;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tuile-pastille img {&lt;br /&gt;
  width: 22px;&lt;br /&gt;
  height: 22px;&lt;br /&gt;
  border-radius: 5px;&lt;br /&gt;
  object-fit: cover;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Petits ecrans : on garde le logo, on masque le titre */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .tuile-pastille span { display: none; }&lt;br /&gt;
  .tuile-pastille { padding: 0.25rem; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5107</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=MediaWiki:Common.js&amp;diff=5107"/>
		<updated>2026-10-24T11:50:52Z</updated>

		<summary type="html">&lt;p&gt;Admin : Page créée avec « /* Tout JavaScript présent ici sera exécuté par tous les utilisateurs à chaque chargement de page. */  /* ===== Fil d&amp;#039;Ariane des tuiles dans l&amp;#039;en-tete (skin Citizen) =====    Affiche entre Accueil et Recherche la/les tuile(s) qui contient(ent)    la page courante (tuile directe ou tuile parente d&amp;#039;un sous-article). */ ( function () { 	&amp;#039;use strict&amp;#039;; 	if ( mw.config.get( &amp;#039;skin&amp;#039; ) !== &amp;#039;Citizen&amp;#039; ) return; 	if ( mw.config.get( &amp;#039;wgNamespaceNumber&amp;#039; ) !== 0 ) return;... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Tout JavaScript présent ici sera exécuté par tous les utilisateurs à chaque chargement de page. */&lt;br /&gt;
&lt;br /&gt;
/* ===== Fil d&#039;Ariane des tuiles dans l&#039;en-tete (skin Citizen) =====&lt;br /&gt;
   Affiche entre Accueil et Recherche la/les tuile(s) qui contient(ent)&lt;br /&gt;
   la page courante (tuile directe ou tuile parente d&#039;un sous-article). */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
	if ( mw.config.get( &#039;skin&#039; ) !== &#039;Citizen&#039; ) return;&lt;br /&gt;
	if ( mw.config.get( &#039;wgNamespaceNumber&#039; ) !== 0 ) return;&lt;br /&gt;
	var current = mw.config.get( &#039;wgPageName&#039; );&lt;br /&gt;
	if ( current === &#039;Accueil&#039; ) return;&lt;br /&gt;
&lt;br /&gt;
	function pastilles( tuiles ) {&lt;br /&gt;
		var header = document.querySelector( &#039;.citizen-header&#039; );&lt;br /&gt;
		if ( !header ) return;&lt;br /&gt;
		var logo = header.querySelector( &#039;.citizen-header__logo&#039; );&lt;br /&gt;
		if ( !logo ) return;&lt;br /&gt;
		var zone = document.createElement( &#039;div&#039; );&lt;br /&gt;
		zone.className = &#039;tuile-fil-ariane citizen-header__item&#039;;&lt;br /&gt;
		tuiles.forEach( function ( t ) {&lt;br /&gt;
			var a = document.createElement( &#039;a&#039; );&lt;br /&gt;
			a.href = mw.util.getUrl( t.cible );&lt;br /&gt;
			a.className = &#039;tuile-pastille&#039;;&lt;br /&gt;
			a.title = &#039;Retour a la tuile : &#039; + t.titre;&lt;br /&gt;
			var img = document.createElement( &#039;img&#039; );&lt;br /&gt;
			img.src = mw.util.wikiScript() + &#039;?title=Special:FilePath&amp;amp;file=&#039; +&lt;br /&gt;
				encodeURIComponent( &#039;Tuile &#039; + t.key + &#039;.webp&#039; ) + &#039;&amp;amp;width=44&#039;;&lt;br /&gt;
			img.alt = &#039;&#039;;&lt;br /&gt;
			var span = document.createElement( &#039;span&#039; );&lt;br /&gt;
			span.textContent = t.titre;&lt;br /&gt;
			a.appendChild( img );&lt;br /&gt;
			a.appendChild( span );&lt;br /&gt;
			zone.appendChild( a );&lt;br /&gt;
		} );&lt;br /&gt;
		logo.insertAdjacentElement( &#039;afterend&#039;, zone );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function lancer() {&lt;br /&gt;
		var api = new mw.Api();&lt;br /&gt;
		var norm = mw.title.new( current ).prefixedText;&lt;br /&gt;
		api.get( { action: &#039;parse&#039;, page: &#039;Accueil&#039;, prop: &#039;text&#039;, formatversion: 2 } )&lt;br /&gt;
		.then( function ( data ) {&lt;br /&gt;
			var doc = new DOMParser().parseFromString( data.parse.text, &#039;text/html&#039; );&lt;br /&gt;
			var tuiles = [];&lt;br /&gt;
			doc.querySelectorAll( &#039;.accueil-tile&#039; ).forEach( function ( el ) {&lt;br /&gt;
				var cible = el.getAttribute( &#039;data-cible&#039; );&lt;br /&gt;
				var cle = el.getAttribute( &#039;data-tuile&#039; );&lt;br /&gt;
				var titre = el.querySelector( &#039;.accueil-tile-title&#039; );&lt;br /&gt;
				if ( cible &amp;amp;&amp;amp; cle ) {&lt;br /&gt;
					tuiles.push( {&lt;br /&gt;
						cible: cible, key: cle,&lt;br /&gt;
						titre: titre ? titre.textContent.trim() : cle&lt;br /&gt;
					} );&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			var trouvees = tuiles.filter( function ( t ) {&lt;br /&gt;
				return mw.title.new( t.cible ).prefixedText === norm;&lt;br /&gt;
			} );&lt;br /&gt;
			return api.get( { action: &#039;query&#039;, list: &#039;backlinks&#039;, bltitle: norm,&lt;br /&gt;
				bllimit: 500, blnamespace: 0, formatversion: 2 } )&lt;br /&gt;
			.then( function ( bd ) {&lt;br /&gt;
				var liens = ( bd.query.backlinks || [] ).map( function ( p ) { return p.title; } );&lt;br /&gt;
				tuiles.forEach( function ( t ) {&lt;br /&gt;
					var cibleNorm = mw.title.new( t.cible ).prefixedText;&lt;br /&gt;
					if ( cibleNorm !== norm &amp;amp;&amp;amp; liens.indexOf( cibleNorm ) !== -1 ) {&lt;br /&gt;
						trouvees.push( t );&lt;br /&gt;
					}&lt;br /&gt;
				} );&lt;br /&gt;
				if ( trouvees.length ) pastilles( trouvees );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$( lancer );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Mod%C3%A8le:Tuile&amp;diff=5106</id>
		<title>Modèle:Tuile</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Mod%C3%A8le:Tuile&amp;diff=5106"/>
		<updated>2026-10-24T11:18:37Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;accueil-tile {{#if:{{{large|}}}|accueil-tile-large}} accueil-tile-{{{1}}}&amp;quot; data-tuile=&amp;quot;{{{1}}}&amp;quot; data-cible=&amp;quot;{{{2}}}&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile {{{1}}}.webp|link={{{2}}}|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;{{{3}}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;{{{4}}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Utilisation : {{Tuile|clé|cible|titre|description|large=oui}}&lt;br /&gt;
  1 = clé de la tuile : image « Fichier:Tuile &amp;lt;clé&amp;gt;.webp » + classe « accueil-tile-&amp;lt;clé&amp;gt; »&lt;br /&gt;
  2 = page cible du lien&lt;br /&gt;
  3 = titre affiché&lt;br /&gt;
  4 = description affichée&lt;br /&gt;
  large = n&#039;importe quoi (ex. « oui ») pour la classe accueil-tile-large&lt;br /&gt;
&lt;br /&gt;
IMPORTANT 1 : l&#039;image doit rester sur sa propre ligne — le CSS de Citizen.css&lt;br /&gt;
positionne via « .accueil-tile &amp;gt; p &amp;gt; span &amp;gt; a &amp;gt; img » et dépend du &amp;lt;p&amp;gt; que&lt;br /&gt;
MediaWiki injecte autour d&#039;une image isolée.&lt;br /&gt;
IMPORTANT 2 : l&#039;espace avant {{#if}} est volontaire — MediaWiki avale les espaces&lt;br /&gt;
au début/fin des arguments de fonctions analyser ; le double espace sur les&lt;br /&gt;
petites tuiles est inoffensif en HTML.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Mod%C3%A8le:Tuile&amp;diff=5105</id>
		<title>Modèle:Tuile</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Mod%C3%A8le:Tuile&amp;diff=5105"/>
		<updated>2026-10-24T11:04:16Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;accueil-tile{{#if:{{{large|}}}| accueil-tile-large}} accueil-tile-{{{1}}}&amp;quot; data-tuile=&amp;quot;{{{1}}}&amp;quot; data-cible=&amp;quot;{{{2}}}&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile {{{1}}}.webp|link={{{2}}}|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;{{{3}}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;{{{4}}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Utilisation : {{Tuile|clé|cible|titre|description|large=oui}}&lt;br /&gt;
  1 = clé de la tuile : image « Fichier:Tuile &amp;lt;clé&amp;gt;.webp » + classe « accueil-tile-&amp;lt;clé&amp;gt; »&lt;br /&gt;
  2 = page cible du lien&lt;br /&gt;
  3 = titre affiché&lt;br /&gt;
  4 = description affichée&lt;br /&gt;
  large = n&#039;importe quoi (ex. « oui ») pour la classe accueil-tile-large&lt;br /&gt;
&lt;br /&gt;
IMPORTANT : l&#039;image doit rester sur sa propre ligne. Le CSS de MediaWiki:Citizen.css&lt;br /&gt;
positionne la tuile via « .accueil-tile &amp;gt; p &amp;gt; span &amp;gt; a &amp;gt; img » — MediaWiki entoure&lt;br /&gt;
l&#039;image d&#039;un &amp;lt;p&amp;gt; grâce aux sauts de ligne, et le CSS en dépend.&lt;br /&gt;
Ne pas mettre le contenu sur une seule ligne, sous peine de casser la mise en page.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Accueil&amp;diff=5104</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Accueil&amp;diff=5104"/>
		<updated>2026-10-24T10:48:15Z</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;
{{Tuile|ia|page_IA|Page dédiée à l&#039;IA|LLM locaux, agents, outils et tests.|large=oui}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|linux|page_Linux|Linux|Commandes, optimisations, scripts et réglages en vrac.|large=oui}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|proxmox|page_ProxMox|ProxMox|VM, LXC, stockage, réseau et sauvegardes.|large=oui}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|mediawiki|MediaWiki|MediaWiki|Moteur de wiki libre pour organiser la documentation.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|jellyfin|Jellyfin|Jellyfin|Serveur libre pour organiser et diffuser ses médias.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|nextcloud|Nextcloud|Nextcloud|Cloud personnel libre pour fichiers, contacts et calendriers.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|docker|page_Docker|Docker|Plateforme de conteneurs pour déployer et isoler des services.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|wireguard|WireGuard_LXC_Alpine_Linux|WireGuard|VPN léger et rapide pour connexions sécurisées.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|prometheus|Prometheus|Prometheus|Supervision, métriques, alertes et tableaux de bord.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|syncthing|Syncthing|Syncthing|Synchronisation de fichiers libre entre plusieurs appareils.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|rustdesk|RustDesk|RustDesk|Bureau à distance libre et sécurisé.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|reverseproxy|Nginx_ReverseProxy_LXC_Alpine_Linux|Proxy inverse Nginx|HTTPS, redirections et accès sécurisé aux services.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|caddy|caddy_ReverseProxy|Proxy inverse Caddy|HTTPS automatique, configuration simple et accès sécurisé aux services.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|ca|Serveur_CA_LXC_Alpine_Linux|Serveur CA|Gestion des certificats, signatures et confiance interne.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|searxng|SearXNG|SearXNG|Recherche web privée et auto-hébergée.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|camofox|Camofox|Camofox|Un navigateur anti-détection open source conçu pour les agents d’IA.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|firecrawl|Firecrawl|Firecrawl|Extraction web open source pour agents d’IA.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|moonlightweb|moonlight_web_stream|Moonlight Web|Accès web au streaming Moonlight depuis vos appareils.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|truenas|page_TrueNAS|TrueNAS|Stockage NAS, ZFS, partages et optimisations.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|wsl|Windows_WSL|WSL|Environnement Linux intégré à Windows.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|suitecrm|SuiteCRM|SuiteCRM|CRM libre pour gestion client et suivi commercial.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|prestashop|PrestaShop|PrestaShop|Solution e-commerce pour gérer une boutique en ligne.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|dolibarr|Dolibarr|Dolibarr|ERP/CRM open source pour gérer clients, ventes, facturation, stocks et projets.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|frappehr|Frappe_HR|Frappe HR|Frappe HR est une solution RH open source complète.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|zoneminder|ZoneMinder|ZoneMinder|Solution NVR libre et historique pour caméras IP.}}&lt;br /&gt;
&lt;br /&gt;
{{Tuile|retrogaming|page_RetroGaming|RetroGaming|Jeux rétro, ROMs, streaming et organisation de ludothèque.|large=oui}}&lt;br /&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=Mod%C3%A8le:Tuile&amp;diff=5103</id>
		<title>Modèle:Tuile</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Mod%C3%A8le:Tuile&amp;diff=5103"/>
		<updated>2026-10-24T10:39:35Z</updated>

		<summary type="html">&lt;p&gt;Admin : Page créée avec « &amp;lt;div class=&amp;quot;accueil-tile{{#if:{{{large|}}}| accueil-tile-large}} accueil-tile-{{{1}}}&amp;quot; data-tuile=&amp;quot;{{{1}}}&amp;quot; data-cible=&amp;quot;{{{2}}}&amp;quot;&amp;gt;class=accueil-tile-img&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;{{{3}}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;{{{4}}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt; &amp;lt;!-- Utilisation : {{Tuile|clé|cible|titre|description|large=oui}}   1 = clé de la tuile : sert pour l&amp;#039;image « Fichier:Tui... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;accueil-tile{{#if:{{{large|}}}| accueil-tile-large}} accueil-tile-{{{1}}}&amp;quot; data-tuile=&amp;quot;{{{1}}}&amp;quot; data-cible=&amp;quot;{{{2}}}&amp;quot;&amp;gt;[[Fichier:Tuile {{{1}}}.webp|link={{{2}}}|class=accueil-tile-img]]&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;{{{3}}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;{{{4}}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Utilisation : {{Tuile|clé|cible|titre|description|large=oui}}&lt;br /&gt;
  1 = clé de la tuile : sert pour l&#039;image « Fichier:Tuile &amp;lt;clé&amp;gt;.webp »&lt;br /&gt;
      ET pour la classe CSS « accueil-tile-&amp;lt;clé&amp;gt; »&lt;br /&gt;
  2 = page cible du lien&lt;br /&gt;
  3 = titre affiché&lt;br /&gt;
  4 = description affichée&lt;br /&gt;
  large = n&#039;importe quoi (ex. « oui ») pour ajouter la classe accueil-tile-large&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
{{Tuile|docker|page_Docker|Docker|Plateforme de conteneurs pour déployer et isoler des services.}}&lt;br /&gt;
&lt;br /&gt;
Attributs data-tuile / data-cible : exploitables par le gadget « lien de retour ».&lt;br /&gt;
Documenter dans la sous-page /Documentation si souhaité.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5102</id>
		<title>Llama-swap</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5102"/>
		<updated>2026-10-23T21:32:45Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Charger un ou plusieurs modèles au démarrage */&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;
=== Charger un ou plusieurs modèles au démarrage ===&lt;br /&gt;
Ajouter à la configuration :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 hooks:&lt;br /&gt;
   on_startup:&lt;br /&gt;
     preload:&lt;br /&gt;
       - &amp;lt;font color = green&amp;gt;Qwen3.8-Flash-Next&amp;lt;/font&amp;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_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 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: 155648&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&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 512&lt;br /&gt;
       -ub 512&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 2048&lt;br /&gt;
       -ub 512&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 512&lt;br /&gt;
       -ub 512&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 Llama.cpp kvcache Q8) Généraliste dense rapide ====&lt;br /&gt;
 # hf download unsloth/Muse-Glimmer-30B-GGUF --include &amp;quot;*UD-Q5_K_L*.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-Q5_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;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: 262144&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-Q5_K_L/Muse-Glimmer-30B-UD-Q5_K_L.gguf&lt;br /&gt;
       --spec-type draft-dflash,ngram-mod&lt;br /&gt;
       --spec-draft-model /opt/models/Muse-Glimmer-30B-GGUF/UD-Q5_K_L/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:262144,dflash.context_length=int:262144&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 tensor&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 512&lt;br /&gt;
       -ub 256&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-Q5_K_L/mmproj-Muse-Glimmer-30B-Q8_0.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
==== [[Strata|Strata]] Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S ====&lt;br /&gt;
   &amp;quot;Qwen3.8-Flash-Next&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Qwen3.8-Flash-Next&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: 262144&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /bin/bash -lc &#039;cd /opt/Strata &amp;amp;&amp;amp; exec env STRATA_DECODE_TIMING=1 STRATA_VERIFY_PROFILE=1 .venv/bin/python -m serve.server --engine strata --config /opt/Strata/strata-iq3_s.json --port ${PORT}&#039;&lt;br /&gt;
       --engine strata&lt;br /&gt;
       --config /opt/Strata/strata-iq3_s.json&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
 &lt;br /&gt;
     proxy: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;127.0.0.1:${PORT}&amp;quot;&lt;br /&gt;
     checkEndpoint: /health&lt;br /&gt;
&lt;br /&gt;
=== En test ===&lt;br /&gt;
==== [[Beellama.cpp#Qwen3.8-27B_Context_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 Kvarn6/Kvarn6 (2x 12 Go de VRAM)]] Spécialiste codeur lent ====&lt;br /&gt;
&lt;br /&gt;
 # sudo hf download unsloth/Qwen3.8-27B-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.8-27B/UD-Q4_K_XL&lt;br /&gt;
 # sudo hf download froggeric/Qwen-Fixed-Chat-Templates --include &amp;quot;*chat_template.jinja*&amp;quot; --local-dir /opt/models/Qwen-Fixed-Chat-Templates&lt;br /&gt;
 # sudo hf download incoai/Qwen3.8-27B-DFlash2-GGUF --include &amp;quot;*Q4*&amp;quot; --local-dir /opt/models/Qwen3.8-27B-Dflash2&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;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: 155648&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;
       --mmproj-offload&lt;br /&gt;
       --mmproj-device CUDA0&lt;br /&gt;
       --image-min-tokens 1024&lt;br /&gt;
       -dev CUDA1,CUDA2&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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-dflash&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/Qwen3.8-27B-Dflash2/Qwen3.8-27B-DFlash2-Q4_K_M.gguf&lt;br /&gt;
       --spec-draft-device CUDA0&lt;br /&gt;
       --spec-draft-ngl all&lt;br /&gt;
       --spec-draft-n-max 7&lt;br /&gt;
       --spec-draft-n-min 0&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5101</id>
		<title>Llama-swap</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5101"/>
		<updated>2026-10-23T21:32:24Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Charger modèle(s) au démarrage */&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;
=== Charger un ou plusieurs modèles au démarrage ===&lt;br /&gt;
Ajouter à la configuration :&lt;br /&gt;
 hooks:&lt;br /&gt;
   on_startup:&lt;br /&gt;
     preload:&lt;br /&gt;
       - &amp;lt;font color = green&amp;gt;Qwen3.8-Flash-Next&amp;lt;/font&amp;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_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 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: 155648&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&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 512&lt;br /&gt;
       -ub 512&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 2048&lt;br /&gt;
       -ub 512&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 512&lt;br /&gt;
       -ub 512&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 Llama.cpp kvcache Q8) Généraliste dense rapide ====&lt;br /&gt;
 # hf download unsloth/Muse-Glimmer-30B-GGUF --include &amp;quot;*UD-Q5_K_L*.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-Q5_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;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: 262144&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-Q5_K_L/Muse-Glimmer-30B-UD-Q5_K_L.gguf&lt;br /&gt;
       --spec-type draft-dflash,ngram-mod&lt;br /&gt;
       --spec-draft-model /opt/models/Muse-Glimmer-30B-GGUF/UD-Q5_K_L/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:262144,dflash.context_length=int:262144&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 tensor&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 512&lt;br /&gt;
       -ub 256&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-Q5_K_L/mmproj-Muse-Glimmer-30B-Q8_0.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
==== [[Strata|Strata]] Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S ====&lt;br /&gt;
   &amp;quot;Qwen3.8-Flash-Next&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Qwen3.8-Flash-Next&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: 262144&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /bin/bash -lc &#039;cd /opt/Strata &amp;amp;&amp;amp; exec env STRATA_DECODE_TIMING=1 STRATA_VERIFY_PROFILE=1 .venv/bin/python -m serve.server --engine strata --config /opt/Strata/strata-iq3_s.json --port ${PORT}&#039;&lt;br /&gt;
       --engine strata&lt;br /&gt;
       --config /opt/Strata/strata-iq3_s.json&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
 &lt;br /&gt;
     proxy: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;127.0.0.1:${PORT}&amp;quot;&lt;br /&gt;
     checkEndpoint: /health&lt;br /&gt;
&lt;br /&gt;
=== En test ===&lt;br /&gt;
==== [[Beellama.cpp#Qwen3.8-27B_Context_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 Kvarn6/Kvarn6 (2x 12 Go de VRAM)]] Spécialiste codeur lent ====&lt;br /&gt;
&lt;br /&gt;
 # sudo hf download unsloth/Qwen3.8-27B-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.8-27B/UD-Q4_K_XL&lt;br /&gt;
 # sudo hf download froggeric/Qwen-Fixed-Chat-Templates --include &amp;quot;*chat_template.jinja*&amp;quot; --local-dir /opt/models/Qwen-Fixed-Chat-Templates&lt;br /&gt;
 # sudo hf download incoai/Qwen3.8-27B-DFlash2-GGUF --include &amp;quot;*Q4*&amp;quot; --local-dir /opt/models/Qwen3.8-27B-Dflash2&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;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: 155648&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;
       --mmproj-offload&lt;br /&gt;
       --mmproj-device CUDA0&lt;br /&gt;
       --image-min-tokens 1024&lt;br /&gt;
       -dev CUDA1,CUDA2&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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-dflash&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/Qwen3.8-27B-Dflash2/Qwen3.8-27B-DFlash2-Q4_K_M.gguf&lt;br /&gt;
       --spec-draft-device CUDA0&lt;br /&gt;
       --spec-draft-ngl all&lt;br /&gt;
       --spec-draft-n-max 7&lt;br /&gt;
       --spec-draft-n-min 0&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5100</id>
		<title>Llama-swap</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5100"/>
		<updated>2026-10-23T21:31:34Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Charger modèle(s) au démarrage */&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;
=== Charger modèle(s) au démarrage ===&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
hooks:&lt;br /&gt;
  on_startup:&lt;br /&gt;
    preload:&lt;br /&gt;
      - &amp;lt;font color = green&amp;gt;Qwen3.8-Flash-Next&amp;lt;/font&amp;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_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 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: 155648&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&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 512&lt;br /&gt;
       -ub 512&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 2048&lt;br /&gt;
       -ub 512&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 512&lt;br /&gt;
       -ub 512&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 Llama.cpp kvcache Q8) Généraliste dense rapide ====&lt;br /&gt;
 # hf download unsloth/Muse-Glimmer-30B-GGUF --include &amp;quot;*UD-Q5_K_L*.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-Q5_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;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: 262144&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-Q5_K_L/Muse-Glimmer-30B-UD-Q5_K_L.gguf&lt;br /&gt;
       --spec-type draft-dflash,ngram-mod&lt;br /&gt;
       --spec-draft-model /opt/models/Muse-Glimmer-30B-GGUF/UD-Q5_K_L/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:262144,dflash.context_length=int:262144&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 tensor&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 512&lt;br /&gt;
       -ub 256&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-Q5_K_L/mmproj-Muse-Glimmer-30B-Q8_0.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
==== [[Strata|Strata]] Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S ====&lt;br /&gt;
   &amp;quot;Qwen3.8-Flash-Next&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Qwen3.8-Flash-Next&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: 262144&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /bin/bash -lc &#039;cd /opt/Strata &amp;amp;&amp;amp; exec env STRATA_DECODE_TIMING=1 STRATA_VERIFY_PROFILE=1 .venv/bin/python -m serve.server --engine strata --config /opt/Strata/strata-iq3_s.json --port ${PORT}&#039;&lt;br /&gt;
       --engine strata&lt;br /&gt;
       --config /opt/Strata/strata-iq3_s.json&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
 &lt;br /&gt;
     proxy: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;127.0.0.1:${PORT}&amp;quot;&lt;br /&gt;
     checkEndpoint: /health&lt;br /&gt;
&lt;br /&gt;
=== En test ===&lt;br /&gt;
==== [[Beellama.cpp#Qwen3.8-27B_Context_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 Kvarn6/Kvarn6 (2x 12 Go de VRAM)]] Spécialiste codeur lent ====&lt;br /&gt;
&lt;br /&gt;
 # sudo hf download unsloth/Qwen3.8-27B-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.8-27B/UD-Q4_K_XL&lt;br /&gt;
 # sudo hf download froggeric/Qwen-Fixed-Chat-Templates --include &amp;quot;*chat_template.jinja*&amp;quot; --local-dir /opt/models/Qwen-Fixed-Chat-Templates&lt;br /&gt;
 # sudo hf download incoai/Qwen3.8-27B-DFlash2-GGUF --include &amp;quot;*Q4*&amp;quot; --local-dir /opt/models/Qwen3.8-27B-Dflash2&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;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: 155648&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;
       --mmproj-offload&lt;br /&gt;
       --mmproj-device CUDA0&lt;br /&gt;
       --image-min-tokens 1024&lt;br /&gt;
       -dev CUDA1,CUDA2&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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-dflash&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/Qwen3.8-27B-Dflash2/Qwen3.8-27B-DFlash2-Q4_K_M.gguf&lt;br /&gt;
       --spec-draft-device CUDA0&lt;br /&gt;
       --spec-draft-ngl all&lt;br /&gt;
       --spec-draft-n-max 7&lt;br /&gt;
       --spec-draft-n-min 0&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5099</id>
		<title>Llama-swap</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5099"/>
		<updated>2026-10-23T21:29:52Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Configuration */&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;
=== Charger modèle(s) au démarrage ===&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
hooks:&lt;br /&gt;
  on_startup:&lt;br /&gt;
    preload:&lt;br /&gt;
      - &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;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_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 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: 155648&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&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 512&lt;br /&gt;
       -ub 512&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 2048&lt;br /&gt;
       -ub 512&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 512&lt;br /&gt;
       -ub 512&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 Llama.cpp kvcache Q8) Généraliste dense rapide ====&lt;br /&gt;
 # hf download unsloth/Muse-Glimmer-30B-GGUF --include &amp;quot;*UD-Q5_K_L*.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-Q5_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;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: 262144&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-Q5_K_L/Muse-Glimmer-30B-UD-Q5_K_L.gguf&lt;br /&gt;
       --spec-type draft-dflash,ngram-mod&lt;br /&gt;
       --spec-draft-model /opt/models/Muse-Glimmer-30B-GGUF/UD-Q5_K_L/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:262144,dflash.context_length=int:262144&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 tensor&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 512&lt;br /&gt;
       -ub 256&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-Q5_K_L/mmproj-Muse-Glimmer-30B-Q8_0.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
==== [[Strata|Strata]] Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S ====&lt;br /&gt;
   &amp;quot;Qwen3.8-Flash-Next&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Qwen3.8-Flash-Next&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: 262144&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /bin/bash -lc &#039;cd /opt/Strata &amp;amp;&amp;amp; exec env STRATA_DECODE_TIMING=1 STRATA_VERIFY_PROFILE=1 .venv/bin/python -m serve.server --engine strata --config /opt/Strata/strata-iq3_s.json --port ${PORT}&#039;&lt;br /&gt;
       --engine strata&lt;br /&gt;
       --config /opt/Strata/strata-iq3_s.json&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
 &lt;br /&gt;
     proxy: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;127.0.0.1:${PORT}&amp;quot;&lt;br /&gt;
     checkEndpoint: /health&lt;br /&gt;
&lt;br /&gt;
=== En test ===&lt;br /&gt;
==== [[Beellama.cpp#Qwen3.8-27B_Context_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 Kvarn6/Kvarn6 (2x 12 Go de VRAM)]] Spécialiste codeur lent ====&lt;br /&gt;
&lt;br /&gt;
 # sudo hf download unsloth/Qwen3.8-27B-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.8-27B/UD-Q4_K_XL&lt;br /&gt;
 # sudo hf download froggeric/Qwen-Fixed-Chat-Templates --include &amp;quot;*chat_template.jinja*&amp;quot; --local-dir /opt/models/Qwen-Fixed-Chat-Templates&lt;br /&gt;
 # sudo hf download incoai/Qwen3.8-27B-DFlash2-GGUF --include &amp;quot;*Q4*&amp;quot; --local-dir /opt/models/Qwen3.8-27B-Dflash2&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;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: 155648&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;
       --mmproj-offload&lt;br /&gt;
       --mmproj-device CUDA0&lt;br /&gt;
       --image-min-tokens 1024&lt;br /&gt;
       -dev CUDA1,CUDA2&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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-dflash&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/Qwen3.8-27B-Dflash2/Qwen3.8-27B-DFlash2-Q4_K_M.gguf&lt;br /&gt;
       --spec-draft-device CUDA0&lt;br /&gt;
       --spec-draft-ngl all&lt;br /&gt;
       --spec-draft-n-max 7&lt;br /&gt;
       --spec-draft-n-min 0&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5098</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5098"/>
		<updated>2026-10-23T19:05:51Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Compilation avec support CUDA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM. &lt;br /&gt;
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev ccache&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Quelques dépendances :&lt;br /&gt;
 # apt install libnccl2 libnccl-dev&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&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 llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
== Utilisation d&#039;un LoRA ==&lt;br /&gt;
=== Installation des dépendances ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # python3 -m venv .venv-convert&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # pip install -U pip&lt;br /&gt;
 # pip install -e .&lt;br /&gt;
=== Conversion ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # python3 convert_lora_to_gguf.py --base-model-id &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt; --trust-remote-code --outtype f16 --outfile /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf /opt/lora/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;/&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Exemple avec &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt;, identifiant Hugging Face.&lt;br /&gt;
}}&lt;br /&gt;
=== Utilisation dans Llama.cpp ===&lt;br /&gt;
Ajouter simplement la ligne suivante :&lt;br /&gt;
 --lora /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf \&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.&lt;br /&gt;
** Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&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;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de configuration d’un modèle MTP + sm tensor ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type draft-mtp \&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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;
== Exemple de configuration d’un modèle MTP + sm tensor +ngram ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type &amp;lt;font color = blue&amp;gt;ngram-mod,&amp;lt;/font&amp;gt;draft-mtp \&lt;br /&gt;
   &amp;lt;font color = blue&amp;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 \&amp;lt;/font&amp;gt;&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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 = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
La combinaison &amp;lt;code&amp;gt;ngram-mod,draft-mtp&amp;lt;/code&amp;gt; permet d&#039;utiliser deux formes de génération spéculative complémentaires. Le MTP prédit quelques tokens à l&#039;avance grâce aux têtes intégrées au modèle, tandis que &amp;lt;code&amp;gt;ngram-mod&amp;lt;/code&amp;gt; recherche dans le contexte des séquences déjà rencontrées afin de proposer directement des blocs plus longs. Cela peut fortement accélérer les régénérations, les reprises de code, les structures répétitives ou les réponses proches d&#039;un texte déjà présent, sans ajouter de second modèle de draft.&lt;br /&gt;
&lt;br /&gt;
Les paramètres &amp;lt;code&amp;gt;--spec-ngram-mod-n-match 24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--spec-ngram-mod-n-min 12&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;--spec-ngram-mod-n-max 48&amp;lt;/code&amp;gt; définissent respectivement la longueur minimale de correspondance recherchée, puis la taille minimale et maximale des blocs proposés. Avec ces valeurs, le mécanisme reste assez sélectif tout en pouvant accélérer nettement les passages répétitifs. Sur du contenu entièrement nouveau, le gain est généralement faible et le MTP reste le principal mécanisme spéculatif.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modèles Embedding ==&lt;br /&gt;
=== [https://huggingface.co/SuperPauly/harrier-oss-v1-0.6b-gguf microsoft/harrier-oss-v1-0.6b] ===&lt;br /&gt;
 # hf download SuperPauly/harrier-oss-v1-0.6b-gguf --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/harrier-oss-v1-0.6b/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-embedding.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Embedding&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/harrier-oss-v1-0.6b/Q8_0/harrier-oss-v1-0.6B-Q8_0.gguf \&lt;br /&gt;
   --alias harrier-oss-v1-0.6b \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --embedding \&lt;br /&gt;
   --pooling last \&lt;br /&gt;
   -c 4096 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 1024 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;--sleep-idle-seconds 300&amp;lt;/font&amp;gt;&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 4096&amp;lt;/code&amp;gt; : définit le contexte maximal accepté par le serveur, ici 4096 tokens. Cette valeur est recommandée pour un serveur d’embedding utilisé avec RAGFlow, car les documents sont normalement découpés en chunks plus petits, souvent autour de 1024 à 2048 tokens. Ce modèle peut monter jusqu’à &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt;, au prix d’une consommation mémoire beaucoup plus élevée.&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;
Pour les modèles d’embedding, les paramètres &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; doivent être configurés avec la même valeur. Par exemple : &amp;lt;code&amp;gt;-b 1024 -ub 1024&amp;lt;/code&amp;gt;. Si &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; est supérieur à &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;llama-server&amp;lt;/code&amp;gt; peut ramener automatiquement les deux valeurs à celle de &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; afin d’éviter une erreur d’assertion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Rerank ==&lt;br /&gt;
=== [https://huggingface.co/Felladrin/gguf-Q8_0-bge-reranker-v2-m3 bge-reranker-v2-m3-Q8_0-GGUF] ===&lt;br /&gt;
 # hf download Felladrin/gguf-Q8_0-bge-reranker-v2-m3 --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/bge-reranker-v2-m3/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/bge-reranker-v2-m3/Q8_0/bge-reranker-v2-m3-q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== [https://huggingface.co/jinaai/jina-reranker-v3.5-GGUF jinaai/jina-reranker-v3.5-GGUF] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
&amp;lt;code&amp;gt;Jina Reranker 3.5&amp;lt;/code&amp;gt; n&#039;est pas encore pris en charge par la version officielle de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;. Ce modèle nécessite un mode encodeur non causal ainsi qu&#039;une option spécifique &amp;lt;code&amp;gt;--output-token-ids&amp;lt;/code&amp;gt;, actuellement absents de la branche officielle. Une pull request est ouverte pour ajouter cette prise en charge : &amp;lt;code&amp;gt;ggml-org/llama.cpp#26286&amp;lt;/code&amp;gt; En attendant son intégration, il faut utiliser le fork de &amp;lt;code&amp;gt;littlewine/llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download jinaai/jina-reranker-v3.5-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/jina-reranker-v3.5/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/jina-reranker-v3.5/Q8_0/jina-reranker-v3.5-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 16384&amp;lt;/code&amp;gt; : valeur confortable pour un serveur de rerank utilisé avec RAGFlow. Le modèle &amp;lt;code&amp;gt;jina-reranker-v3.5&amp;lt;/code&amp;gt; reçoit la requête utilisateur ainsi qu’une liste de chunks candidats à comparer, ce qui nécessite davantage de contexte qu’un modèle d’embedding traitant les chunks individuellement. Il prend théoriquement en charge jusqu’à &amp;lt;code&amp;gt;131072&amp;lt;/code&amp;gt; tokens de contexte, mais une telle valeur augmente fortement la consommation de VRAM ou de RAM et n’est généralement pas utile pour un serveur local. Une fenêtre de &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens offre donc une marge importante pour les requêtes et les chunks habituellement envoyés par RAGFlow.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Img2txt ==&lt;br /&gt;
=== [https://huggingface.co/mradermacher/LightOnOCR-2-1B-GGUF mradermacher/LightOnOCR-2-1B-GGUF] ===&lt;br /&gt;
 # hf download mradermacher/LightOnOCR-2-1B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-f16*.gguf&amp;quot; --local-dir /opt/models/LightOnOCR-2-1B/Q8_0&lt;br /&gt;
 # rm -f /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-Q8_0.gguf&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-img2txt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Img2txt LightOnOCR-2-1B&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.Q8_0.gguf \&lt;br /&gt;
   --mmproj /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-f16.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8082&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 8192&amp;lt;/code&amp;gt; : valeur recommandée pour un serveur Img2txt/OCR utilisé avec LightOnOCR-2-1B. Le modèle supporte jusqu’à &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens, mais &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; offre déjà une marge confortable pour traiter une image ou une page scannée avec beaucoup de texte.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles auxiliaires ==&lt;br /&gt;
=== Vision ===&lt;br /&gt;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Thinking-GGUF/tree/main Qwen3-VL-4B-Thinking] (Dépôt officiel) ====&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Thinking-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Thinking-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/Qwen3VL-4B-Thinking-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/mmproj-Qwen3VL-4B-Thinking-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 1.0 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 0.0 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct-GGUF  Qwen3-VL-4B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Instruct-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 5,25gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/Qwen3VL-4B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/mmproj-Qwen3VL-4B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct-GGUF  Qwen3-VL-2B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-2B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 3gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/Qwen3VL-2B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
=== Généraliste ===&lt;br /&gt;
==== [https://huggingface.co/bartowski/LiquidAI_LFM2.5-2.6B-GGUF LFM2.5-2.6B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
FM2.5-2.6B est un petit modèle performant et multilingue, particulièrement adapté aux usages agentiques et aux appels d&#039;outils. LiquidAI fournit notamment des exemples de configuration pour Hermes, OpenClaw et Pi. Il prend nativement en charge une fenêtre de contexte allant jusqu&#039;à 131072 tokens, ce qui est particulièrement intéressant pour certaines tâches auxiliaires nécessitant un contexte important, comme le module de compression de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # hf download bartowski/LiquidAI_LFM2.5-2.6B-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
== Modèles de langage spécialisés en traduction ==&lt;br /&gt;
=== [[https://huggingface.co/unsloth/Hy-MT2-7B-GGUF Hy-MT2-7B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-7B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-7B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-7B/UD-Q6_K_XL/Hy-MT2-7B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [[https://huggingface.co/unsloth/Hy-MT2-1.8B-GGUF Hy-MT2-1.8B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-1.8B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL/Hy-MT2-1.8B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/mradermacher/Hunyuan-MT-7B-GGUF Hunyuan-MT-7B] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Modèle ancien et dépassé. De plus, sa licence interdit son utilisation dans de nombreux territoires, dont l&#039;Union européenne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download mradermacher/Hunyuan-MT-7B-GGUF --include &amp;quot;*Q6*.gguf&amp;quot; --local-dir /opt/models/Hunyuan-MT-7B/Q6_K&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hunyuan-MT-7B/Q6_K/Hunyuan-MT-7B.Q6_K.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&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 2048 \&lt;br /&gt;
     -ub 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat] pour test traduction intelligente rapide ===&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*Q4*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 bf16 \&lt;br /&gt;
     -ctv bf16 \&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;
     --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-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q4_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;
 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;
=== [https://huggingface.co/unsloth/gemma-4-31B-it-qat-GGUF gemma-4-31B-it-qat] pour test traduction intelligente (2x 12 Go de VRAM) ===&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;MTP/mtp-gemma-4-31B-it-Q8_0.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 512 \&lt;br /&gt;
     -ub 512 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --spec-type ngram-mod,ngram-map-k4v,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-ngram-map-k4v-size-n 12 \&lt;br /&gt;
     --spec-ngram-map-k4v-size-m 48 \&lt;br /&gt;
     --spec-ngram-map-k4v-min-hits 1 \&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;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5097</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=5097"/>
		<updated>2026-10-23T19:01:32Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Compilation avec support CUDA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM. &lt;br /&gt;
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev ccache&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Quelques dépendances :&lt;br /&gt;
 # apt install libnccl2 libnccl-dev&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -GGML_CUDA_FA_QUANTS=all -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.&lt;br /&gt;
&lt;br /&gt;
L&#039;intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&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 llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=ON &amp;lt;font color=green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt; -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
== Utilisation d&#039;un LoRA ==&lt;br /&gt;
=== Installation des dépendances ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # python3 -m venv .venv-convert&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # pip install -U pip&lt;br /&gt;
 # pip install -e .&lt;br /&gt;
=== Conversion ===&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # source .venv-convert/bin/activate&lt;br /&gt;
 # python3 convert_lora_to_gguf.py --base-model-id &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt; --trust-remote-code --outtype f16 --outfile /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf /opt/lora/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;/&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Exemple avec &amp;lt;font color = blue&amp;gt;tencent/Hy-MT2-1.8B&amp;lt;/font&amp;gt;, identifiant Hugging Face.&lt;br /&gt;
}}&lt;br /&gt;
=== Utilisation dans Llama.cpp ===&lt;br /&gt;
Ajouter simplement la ligne suivante :&lt;br /&gt;
 --lora /opt/models/&amp;lt;font color = blue&amp;gt;Hy-MT2-1.8B&amp;lt;/font&amp;gt;/&amp;lt;font color = blue&amp;gt;mon_lora&amp;lt;/font&amp;gt;.gguf \&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.&lt;br /&gt;
** Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&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;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&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;
  --temp 0.6 \&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;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Exemple de configuration d’un modèle MTP + sm tensor ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type draft-mtp \&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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;
== Exemple de configuration d’un modèle MTP + sm tensor +ngram ==&lt;br /&gt;
=== Qwen3.6-27B-UD-Q4_K_XL + kvcache Q8 Q8 (2x 12 Go de VRAM)===&lt;br /&gt;
 # hf download unsloth/Qwen3.6-27B-MTP-GGUF  --include Qwen3.6-27B-UD-Q4_K_XL.gguf --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp Qwen3.6-27B MTP server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3.6-27B-MTP-GGUF/UD-Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3.6-27B-MTP-GGUF/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 98304 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   --load-mode none \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   --spec-type &amp;lt;font color = blue&amp;gt;ngram-mod,&amp;lt;/font&amp;gt;draft-mtp \&lt;br /&gt;
   &amp;lt;font color = blue&amp;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 \&amp;lt;/font&amp;gt;&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 none \&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 0.6 \&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 0.0.0.0 \&lt;br /&gt;
   --port 8080 \&lt;br /&gt;
   --api-key-file /etc/ai/ssl/api-keys.txt \&lt;br /&gt;
   --ssl-key-file /etc/ai/ssl/server.key \&lt;br /&gt;
   --ssl-cert-file /etc/ai/ssl/server.crt&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 = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
La combinaison &amp;lt;code&amp;gt;ngram-mod,draft-mtp&amp;lt;/code&amp;gt; permet d&#039;utiliser deux formes de génération spéculative complémentaires. Le MTP prédit quelques tokens à l&#039;avance grâce aux têtes intégrées au modèle, tandis que &amp;lt;code&amp;gt;ngram-mod&amp;lt;/code&amp;gt; recherche dans le contexte des séquences déjà rencontrées afin de proposer directement des blocs plus longs. Cela peut fortement accélérer les régénérations, les reprises de code, les structures répétitives ou les réponses proches d&#039;un texte déjà présent, sans ajouter de second modèle de draft.&lt;br /&gt;
&lt;br /&gt;
Les paramètres &amp;lt;code&amp;gt;--spec-ngram-mod-n-match 24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--spec-ngram-mod-n-min 12&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;--spec-ngram-mod-n-max 48&amp;lt;/code&amp;gt; définissent respectivement la longueur minimale de correspondance recherchée, puis la taille minimale et maximale des blocs proposés. Avec ces valeurs, le mécanisme reste assez sélectif tout en pouvant accélérer nettement les passages répétitifs. Sur du contenu entièrement nouveau, le gain est généralement faible et le MTP reste le principal mécanisme spéculatif.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modèles Embedding ==&lt;br /&gt;
=== [https://huggingface.co/SuperPauly/harrier-oss-v1-0.6b-gguf microsoft/harrier-oss-v1-0.6b] ===&lt;br /&gt;
 # hf download SuperPauly/harrier-oss-v1-0.6b-gguf --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/harrier-oss-v1-0.6b/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-embedding.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Embedding&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/harrier-oss-v1-0.6b/Q8_0/harrier-oss-v1-0.6B-Q8_0.gguf \&lt;br /&gt;
   --alias harrier-oss-v1-0.6b \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --embedding \&lt;br /&gt;
   --pooling last \&lt;br /&gt;
   -c 4096 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 1024 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   &amp;lt;font color = green&amp;gt;--sleep-idle-seconds 300&amp;lt;/font&amp;gt;&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 4096&amp;lt;/code&amp;gt; : définit le contexte maximal accepté par le serveur, ici 4096 tokens. Cette valeur est recommandée pour un serveur d’embedding utilisé avec RAGFlow, car les documents sont normalement découpés en chunks plus petits, souvent autour de 1024 à 2048 tokens. Ce modèle peut monter jusqu’à &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt;, au prix d’une consommation mémoire beaucoup plus élevée.&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;
Pour les modèles d’embedding, les paramètres &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; doivent être configurés avec la même valeur. Par exemple : &amp;lt;code&amp;gt;-b 1024 -ub 1024&amp;lt;/code&amp;gt;. Si &amp;lt;code&amp;gt;n_batch&amp;lt;/code&amp;gt; est supérieur à &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;llama-server&amp;lt;/code&amp;gt; peut ramener automatiquement les deux valeurs à celle de &amp;lt;code&amp;gt;n_ubatch&amp;lt;/code&amp;gt; afin d’éviter une erreur d’assertion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Rerank ==&lt;br /&gt;
=== [https://huggingface.co/Felladrin/gguf-Q8_0-bge-reranker-v2-m3 bge-reranker-v2-m3-Q8_0-GGUF] ===&lt;br /&gt;
 # hf download Felladrin/gguf-Q8_0-bge-reranker-v2-m3 --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/bge-reranker-v2-m3/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/bge-reranker-v2-m3/Q8_0/bge-reranker-v2-m3-q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== [https://huggingface.co/jinaai/jina-reranker-v3.5-GGUF jinaai/jina-reranker-v3.5-GGUF] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte =&lt;br /&gt;
&amp;lt;code&amp;gt;Jina Reranker 3.5&amp;lt;/code&amp;gt; n&#039;est pas encore pris en charge par la version officielle de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;. Ce modèle nécessite un mode encodeur non causal ainsi qu&#039;une option spécifique &amp;lt;code&amp;gt;--output-token-ids&amp;lt;/code&amp;gt;, actuellement absents de la branche officielle. Une pull request est ouverte pour ajouter cette prise en charge : &amp;lt;code&amp;gt;ggml-org/llama.cpp#26286&amp;lt;/code&amp;gt; En attendant son intégration, il faut utiliser le fork de &amp;lt;code&amp;gt;littlewine/llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download jinaai/jina-reranker-v3.5-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --local-dir /opt/models/jina-reranker-v3.5/Q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-rerank.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Rerank&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/jina-reranker-v3.5/Q8_0/jina-reranker-v3.5-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8081&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --reranking \&lt;br /&gt;
   --pooling rank \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 16384&amp;lt;/code&amp;gt; : valeur confortable pour un serveur de rerank utilisé avec RAGFlow. Le modèle &amp;lt;code&amp;gt;jina-reranker-v3.5&amp;lt;/code&amp;gt; reçoit la requête utilisateur ainsi qu’une liste de chunks candidats à comparer, ce qui nécessite davantage de contexte qu’un modèle d’embedding traitant les chunks individuellement. Il prend théoriquement en charge jusqu’à &amp;lt;code&amp;gt;131072&amp;lt;/code&amp;gt; tokens de contexte, mais une telle valeur augmente fortement la consommation de VRAM ou de RAM et n’est généralement pas utile pour un serveur local. Une fenêtre de &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens offre donc une marge importante pour les requêtes et les chunks habituellement envoyés par RAGFlow.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles Img2txt ==&lt;br /&gt;
=== [https://huggingface.co/mradermacher/LightOnOCR-2-1B-GGUF mradermacher/LightOnOCR-2-1B-GGUF] ===&lt;br /&gt;
 # hf download mradermacher/LightOnOCR-2-1B-GGUF --include &amp;quot;*Q8_0*.gguf&amp;quot; --include &amp;quot;*mmproj-f16*.gguf&amp;quot; --local-dir /opt/models/LightOnOCR-2-1B/Q8_0&lt;br /&gt;
 # rm -f /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-Q8_0.gguf&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-img2txt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Img2txt LightOnOCR-2-1B&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.Q8_0.gguf \&lt;br /&gt;
   --mmproj /opt/models/LightOnOCR-2-1B/Q8_0/LightOnOCR-2-1B.mmproj-f16.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8082&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 8192 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--sleep-idle-seconds 300&amp;lt;/code&amp;gt; : décharge le modèle après 300 secondes d’inactivité.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;-c 8192&amp;lt;/code&amp;gt; : valeur recommandée pour un serveur Img2txt/OCR utilisé avec LightOnOCR-2-1B. Le modèle supporte jusqu’à &amp;lt;code&amp;gt;16384&amp;lt;/code&amp;gt; tokens, mais &amp;lt;code&amp;gt;8192&amp;lt;/code&amp;gt; offre déjà une marge confortable pour traiter une image ou une page scannée avec beaucoup de texte.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Modèles auxiliaires ==&lt;br /&gt;
=== Vision ===&lt;br /&gt;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Thinking-GGUF/tree/main Qwen3-VL-4B-Thinking] (Dépôt officiel) ====&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Thinking-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Thinking-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/Qwen3VL-4B-Thinking-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Thinking/Q4_K_M/mmproj-Qwen3VL-4B-Thinking-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.95 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 1.0 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 0.0 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-4B-Instruct-GGUF  Qwen3-VL-4B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-4B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;*mmproj-Qwen3VL-4B-Instruct-Q8_0*.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 5,25gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/Qwen3VL-4B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-4B-Instruct/Q4_K_M/mmproj-Qwen3VL-4B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
==== [https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct-GGUF  Qwen3-VL-2B-Instruct] (Dépôt officiel) ====&lt;br /&gt;
&lt;br /&gt;
 # hf download Qwen/Qwen3-VL-2B-Instruct-GGUF --include &amp;quot;*Q4_K_M*.gguf&amp;quot; --include &amp;quot;mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf&amp;quot; --local-dir /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M&lt;br /&gt;
* Environ 3gb de vram consommée :&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama-server Vision&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/Qwen3VL-2B-Instruct-Q4_K_M.gguf \&lt;br /&gt;
   --mmproj /opt/models/Qwen3-VL-2B-Instruct/Q4_K_M/mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port &amp;lt;font color = blue&amp;gt;8083&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 16384 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 4 \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   --flash-attn on \&lt;br /&gt;
   --jinja \&lt;br /&gt;
   --top-p 0.8 \&lt;br /&gt;
   --top-k 20 \&lt;br /&gt;
   --temp 0.7 \&lt;br /&gt;
   --min-p 0.0 \&lt;br /&gt;
   --presence-penalty 1.5 \&lt;br /&gt;
   --image-min-tokens 1024 \&lt;br /&gt;
   --image-max-tokens 4096 \&lt;br /&gt;
   --sleep-idle-seconds 300&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;
=== Généraliste ===&lt;br /&gt;
==== [https://huggingface.co/bartowski/LiquidAI_LFM2.5-2.6B-GGUF LFM2.5-2.6B] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
FM2.5-2.6B est un petit modèle performant et multilingue, particulièrement adapté aux usages agentiques et aux appels d&#039;outils. LiquidAI fournit notamment des exemples de configuration pour Hermes, OpenClaw et Pi. Il prend nativement en charge une fenêtre de contexte allant jusqu&#039;à 131072 tokens, ce qui est particulièrement intéressant pour certaines tâches auxiliaires nécessitant un contexte important, comme le module de compression de Hermes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 # hf download bartowski/LiquidAI_LFM2.5-2.6B-GGUF --include &amp;quot;*Q6_K_L*.gguf&amp;quot; --local-dir /opt/models/LFM2.5-2.6B-GGUF/Q6_K_L&lt;br /&gt;
&lt;br /&gt;
== Modèles de langage spécialisés en traduction ==&lt;br /&gt;
=== [[https://huggingface.co/unsloth/Hy-MT2-7B-GGUF Hy-MT2-7B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-7B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-7B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-7B/UD-Q6_K_XL/Hy-MT2-7B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [[https://huggingface.co/unsloth/Hy-MT2-1.8B-GGUF Hy-MT2-1.8B]] ===&lt;br /&gt;
 # hf download unsloth/Hy-MT2-1.8B-GGUF --include &amp;quot;*UD-Q6_K_XL*.gguf&amp;quot; --local-dir /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hy-MT2-1.8B/UD-Q6_K_XL/Hy-MT2-1.8B-UD-Q6_K_XL.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 32768 \&lt;br /&gt;
     -n 4096 \&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 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/mradermacher/Hunyuan-MT-7B-GGUF Hunyuan-MT-7B] ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  = Modèle ancien et dépassé. De plus, sa licence interdit son utilisation dans de nombreux territoires, dont l&#039;Union européenne.&lt;br /&gt;
}}&lt;br /&gt;
 # hf download mradermacher/Hunyuan-MT-7B-GGUF --include &amp;quot;*Q6*.gguf&amp;quot; --local-dir /opt/models/Hunyuan-MT-7B/Q6_K&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /opt/models/Hunyuan-MT-7B/Q6_K/Hunyuan-MT-7B.Q6_K.gguf \&lt;br /&gt;
     --host 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&lt;br /&gt;
     -ngl 999 \&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 2048 \&lt;br /&gt;
     -ub 1024 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --temp 0.7 \&lt;br /&gt;
     --top-k 20 \&lt;br /&gt;
     --top-p 0.6 \&lt;br /&gt;
     --repeat-penalty 1.05 \&lt;br /&gt;
     --sleep-idle-seconds 300&lt;br /&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;
=== [https://huggingface.co/unsloth/gemma-4-26B-A4B-it-qat-GGUF gemma-4-26B-A4B-it-qat] pour test traduction intelligente rapide ===&lt;br /&gt;
 # hf download unsloth/gemma-4-26B-A4B-it-qat-GGUF --include &amp;quot;*Q4*.gguf&amp;quot; --local-dir /opt/models/gemma-4-26B-A4B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 bf16 \&lt;br /&gt;
     -ctv bf16 \&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;
     --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-26B-A4B-it-qat/UD-Q4_K_XL/MTP/mtp-gemma-4-26B-A4B-it-Q4_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;
 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;
=== [https://huggingface.co/unsloth/gemma-4-31B-it-qat-GGUF gemma-4-31B-it-qat] pour test traduction intelligente (2x 12 Go de VRAM) ===&lt;br /&gt;
 # hf download unsloth/gemma-4-31B-it-qat-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;MTP/mtp-gemma-4-31B-it-Q8_0.gguf&amp;quot; --local-dir /opt/models/gemma-4-31B-it-qat/UD-Q4_K_XL&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/llama-translation.service&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte = &lt;br /&gt;
Avec certaines versions récentes de &#039;&#039;&#039;llama.cpp&#039;&#039;&#039;, le serveur peut planter lors de l&#039;utilisation de &#039;&#039;&#039;Gemma 4&#039;&#039;&#039; avec &#039;&#039;&#039;MTP&#039;&#039;&#039; et le mode de répartition multi-GPU &amp;lt;code&amp;gt;-sm tensor&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--split-mode tensor&amp;lt;/code&amp;gt;. Le problème semble lié à la réutilisation des graphes de calcul (&#039;&#039;graph reuse&#039;&#039;) dans cette configuration. En attendant une correction upstream, ajouter temporairement dans la section &amp;lt;code&amp;gt;[Service]&amp;lt;/code&amp;gt; du service systemd :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Environment=&amp;quot;LLAMA_GRAPH_REUSE_DISABLE=1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Llama Translation Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/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 0.0.0.0 \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;8084&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt; \&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 512 \&lt;br /&gt;
     -ub 512 \&lt;br /&gt;
     -fa on \&lt;br /&gt;
     --jinja \&lt;br /&gt;
     --spec-type ngram-mod,ngram-map-k4v,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-ngram-map-k4v-size-n 12 \&lt;br /&gt;
     --spec-ngram-map-k4v-size-m 48 \&lt;br /&gt;
     --spec-ngram-map-k4v-min-hits 1 \&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;
 Restart=on-failure&lt;br /&gt;
 RestartSec=3&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=CrispASR&amp;diff=5096</id>
		<title>CrispASR</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=CrispASR&amp;diff=5096"/>
		<updated>2026-10-23T18:06:47Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
&lt;br /&gt;
* On récupère le projet :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone --recurse-submodules &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/CrispStrobe/CrispASR&lt;br /&gt;
 # cd CrispASR&lt;br /&gt;
* On installe quelques dépendances avant la compilation ( activer [[Debian_APT#Dépôts_contrib_et_non-free|les dépôts contrib et non-free]] si nécessaire) :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install libopencore-amrnb-dev libopencore-amrwb-dev libopus-dev libopusfile-dev libopenblas-dev ccache libfdk-aac-dev libsentencepiece-dev sentencepiece libopenblas-dev libnccl2 libnccl-dev libmp3lame-dev ffmpeg&lt;br /&gt;
 # ln -s /usr/lib/x86_64-linux-gnu/libopenblas.so /usr/local/lib/libcblas.so&lt;br /&gt;
 # ldconfig&lt;br /&gt;
* On configure la compilation en choisissant le backend adapté au matériel utilisé.&lt;br /&gt;
&lt;br /&gt;
Version CPU :&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release&lt;br /&gt;
&lt;br /&gt;
Version NVIDIA avec CUDA — nécessite l’installation préalable du CUDA Toolkit :&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DGGML_CUDA_FA_QUANTS=all -DGGML_LTO=ON&lt;br /&gt;
&lt;br /&gt;
Version Apple Silicon avec Metal :&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_METAL=ON&lt;br /&gt;
&lt;br /&gt;
Version Vulkan — nécessite l’installation préalable des bibliothèques et outils de développement Vulkan :&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_VULKAN=ON&lt;br /&gt;
&lt;br /&gt;
* On lance ensuite la compilation :&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les exécutables sont générés dans le répertoire &amp;lt;code&amp;gt;/opt/CrispASR/build/bin/&amp;lt;/code&amp;gt;.&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd /opt/CrispASR/&lt;br /&gt;
 # rm -r build&lt;br /&gt;
 # git pull --recurse-submodules&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Exemples ===&lt;br /&gt;
==== Speech-to-Text ====&lt;br /&gt;
===== [https://huggingface.co/cstr/parakeet-tdt-0.6b-v3-GGUF cstr/parakeet-tdt-0.6b-v3-GGUF] =====&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/parakeet-tdt-0.6b-v3-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/stt/parakeet-tdt-0.6b-v3/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-stt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Speech-to-Text Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend parakeet \&lt;br /&gt;
     -m /opt/models/stt/parakeet-tdt-0.6b-v3/q8_0/parakeet-tdt-0.6b-v3-q8_0.gguf \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;auto&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;7980&amp;lt;/font&amp;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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Parakeet est suffisamment léger pour fonctionner correctement sur CPU avec l’option &amp;lt;code&amp;gt;-ng&amp;lt;/code&amp;gt;. Il est également possible de définir le nombre de threads CPU utilisés avec l’option &amp;lt;code&amp;gt;-t &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;N&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; ; la valeur par défaut est de 4.&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;
La variable &amp;lt;code&amp;gt;Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; est facultative. Elle permet d’activer l’authentification par clé API sur le serveur CrispASR. Pour une utilisation avec Hermes, la valeur configurée ici doit être strictement identique à celle définie dans &amp;lt;code&amp;gt;VOICE_TOOLS_OPENAI_KEY&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Text-to-Speech ====&lt;br /&gt;
===== [https://huggingface.co/cstr/qwen3-tts-1.7b-base-GGUF Qwen3-TTS-12Hz-1.7B-Base] =====&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/qwen3-tts-1.7b-base-GGUF --include &amp;quot;*q8*.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0&lt;br /&gt;
 # hf download cstr/qwen3-tts-tokenizer-12hz-GGUF --include &amp;quot;qwen3-tts-tokenizer-12hz.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend qwen3-tts \&lt;br /&gt;
     -m /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0/qwen3-tts-12hz-1.7b-base-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0/qwen3-tts-tokenizer-12hz.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-pad-silence-ms &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-cfg-scale &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-steps &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Ce modèle est fourni sans voix. Il est donc nécessaire de placer un fichier WAV ainsi que sa transcription au format TXT dans le dossier &amp;lt;code&amp;gt;/opt/voices&amp;lt;/code&amp;gt; (par exemple : &amp;lt;code&amp;gt;henriette.wav&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;henriette.txt&amp;lt;/code&amp;gt;).&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;
La variable &amp;lt;code&amp;gt;Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; est facultative. Elle permet d’activer l’authentification par clé API sur le serveur CrispASR. Pour une utilisation avec Hermes, la valeur configurée ici doit être strictement identique à celle définie dans &amp;lt;code&amp;gt;VOICE_TOOLS_OPENAI_KEY&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-pad-silence-ms&amp;lt;/code&amp;gt; : Ajoute un silence au début du fichier audio généré. Utile pour compenser le buffer de lecture, le resampling ou les artefacts de démarrage du codec. Mesure en millisecondes. Par défaut 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-cfg-scale&amp;lt;/code&amp;gt; : Échelle de guidance classifier-free pour la synthèse vocale. Contrôle à quel point le modèle suit strictement le texte et la voix de référence. Valeur &amp;gt;1 renforce la fidélité, valeur &amp;lt;1 donne plus de liberté créative.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;---tts-steps&amp;lt;/code&amp;gt; : nombre d’étapes de diffusion/ODE. Plus = plus lent mais plus propre.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== [https://huggingface.co/cstr/qwen3-tts-0.6b-base-GGUF Qwen3-TTS-12Hz-0.6B-Base] =====&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/qwen3-tts-0.6b-base-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0&lt;br /&gt;
 # hf download cstr/qwen3-tts-tokenizer-12hz-GGUF --include &amp;quot;qwen3-tts-tokenizer-12hz.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend qwen3-tts \&lt;br /&gt;
     -m /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0/qwen3-tts-12hz-0.6b-base-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0/qwen3-tts-tokenizer-12hz.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-pad-silence-ms &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;200&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-cfg-scale &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-steps &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Ce modèle est fourni sans voix. Il est donc nécessaire de placer un fichier WAV ainsi que sa transcription au format TXT dans le dossier &amp;lt;code&amp;gt;/opt/voices&amp;lt;/code&amp;gt; (par exemple : &amp;lt;code&amp;gt;henriette.wav&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;henriette.txt&amp;lt;/code&amp;gt;).&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;
La variable &amp;lt;code&amp;gt;Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; est facultative. Elle permet d’activer l’authentification par clé API sur le serveur CrispASR. Pour une utilisation avec Hermes, la valeur configurée ici doit être strictement identique à celle définie dans &amp;lt;code&amp;gt;VOICE_TOOLS_OPENAI_KEY&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-pad-silence-ms&amp;lt;/code&amp;gt; : Ajoute un silence au début du fichier audio généré. Utile pour compenser le buffer de lecture, le resampling ou les artefacts de démarrage du codec. Mesure en millisecondes. Par défaut 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-cfg-scale&amp;lt;/code&amp;gt; : Échelle de guidance classifier-free pour la synthèse vocale. Contrôle à quel point le modèle suit strictement le texte et la voix de référence. Valeur &amp;gt;1 renforce la fidélité, valeur &amp;lt;1 donne plus de liberté créative.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;---tts-steps&amp;lt;/code&amp;gt; : nombre d’étapes de diffusion/ODE. Plus = plus lent mais plus propre.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== [https://huggingface.co/cstr/chatterbox-GGUF Chatterbox] =====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Informations vérifiées le 23/07/2026. La compatibilité avec CrispASR semble actuellement limitée. Le modèle est trop lourd pour une utilisation en temps réel avec un chatbot, mais offre une très bonne qualité audio.&lt;br /&gt;
}}&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/chatterbox-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/tts/chatterbox-GGUF/q8_0&lt;br /&gt;
-----&lt;br /&gt;
* Installer des voix :&lt;br /&gt;
 # mkdir /opt/voices&lt;br /&gt;
Fichier &amp;lt;code&amp;gt;.wav&amp;lt;/code&amp;gt; avec un nom de personnalité dans le dossier &amp;lt;code&amp;gt;/opt/voices&amp;lt;/code&amp;gt;&lt;br /&gt;
Optionnellement on joint le fichier de la transcription exacte de l’enregistrement, exemple :&lt;br /&gt;
 # vi /opt/voices/&amp;lt;font color = blue&amp;gt;henriette&amp;lt;/font&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
 bla bla bla&lt;br /&gt;
&lt;br /&gt;
GGUF : :&lt;br /&gt;
 cd /opt/CrispASR&lt;br /&gt;
 python3 -m venv .venv-chatterbox&lt;br /&gt;
 source .venv-chatterbox/bin/activate&lt;br /&gt;
 pip install --upgrade pip&lt;br /&gt;
 pip install numpy&lt;br /&gt;
 source /opt/CrispASR/.venv-chatterbox/bin/activate&lt;br /&gt;
 pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu128&lt;br /&gt;
 pip install chatterbox-tts&lt;br /&gt;
 pip install gguf&lt;br /&gt;
&lt;br /&gt;
 # python models/bake-chatterbox-voice-from-wav.py --input /opt/voices/henriette.wav --output /opt/voices/henriette.gguf&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend chatterbox \&lt;br /&gt;
     -m /opt/models/tts/chatterbox-GGUF/q8_0/chatterbox-t3-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/chatterbox-GGUF/q8_0/chatterbox-s3gen-q8_0.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;
===== [https://huggingface.co/cstr/omnivoice-GGUF OmniVoice] =====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Informations vérifiées le 23/07/2026. Basé sur Qwen3-TTS, ce modèle offre des performances et une qualité similaires, mais ne semble pas capable de conserver une voix fixe, probablement en raison d’un bug.&lt;br /&gt;
}}&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/omnivoice-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/tts/omnivoice-GGUF/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend omnivoice \&lt;br /&gt;
     -m /opt/models/tts/omnivoice-GGUF/q8_0/omnivoice-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/omnivoice-GGUF/q8_0/omnivoice-tokenizer-q8_0.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=CrispASR&amp;diff=5095</id>
		<title>CrispASR</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=CrispASR&amp;diff=5095"/>
		<updated>2026-10-23T17:58:50Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
&lt;br /&gt;
* On récupère le projet :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone --recurse-submodules &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/CrispStrobe/CrispASR&lt;br /&gt;
 # cd CrispASR&lt;br /&gt;
* On installe quelques dépendances avant la compilation ( activer [[Debian_APT#Dépôts_contrib_et_non-free|les dépôts contrib et non-free]] si nécessaire) :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install libopencore-amrnb-dev libopencore-amrwb-dev libopus-dev libopusfile-dev libopenblas-dev ccache libfdk-aac-dev libsentencepiece-dev sentencepiece libopenblas-dev libnccl2 libnccl-dev libmp3lame-dev ffmpeg&lt;br /&gt;
 # ln -s /usr/lib/x86_64-linux-gnu/libopenblas.so /usr/local/lib/libcblas.so&lt;br /&gt;
 # ldconfig&lt;br /&gt;
* On configure la compilation en choisissant le backend adapté au matériel utilisé.&lt;br /&gt;
&lt;br /&gt;
Version CPU :&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release&lt;br /&gt;
&lt;br /&gt;
Version NVIDIA avec CUDA — nécessite l’installation préalable du CUDA Toolkit :&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON -DGGML_LTO=ON&lt;br /&gt;
&lt;br /&gt;
Version Apple Silicon avec Metal :&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_METAL=ON&lt;br /&gt;
&lt;br /&gt;
Version Vulkan — nécessite l’installation préalable des bibliothèques et outils de développement Vulkan :&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_VULKAN=ON&lt;br /&gt;
&lt;br /&gt;
* On lance ensuite la compilation :&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les exécutables sont générés dans le répertoire &amp;lt;code&amp;gt;/opt/CrispASR/build/bin/&amp;lt;/code&amp;gt;.&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd /opt/CrispASR/&lt;br /&gt;
 # rm -r build&lt;br /&gt;
 # git pull --recurse-submodules&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Exemples ===&lt;br /&gt;
==== Speech-to-Text ====&lt;br /&gt;
===== [https://huggingface.co/cstr/parakeet-tdt-0.6b-v3-GGUF cstr/parakeet-tdt-0.6b-v3-GGUF] =====&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/parakeet-tdt-0.6b-v3-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/stt/parakeet-tdt-0.6b-v3/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-stt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Speech-to-Text Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend parakeet \&lt;br /&gt;
     -m /opt/models/stt/parakeet-tdt-0.6b-v3/q8_0/parakeet-tdt-0.6b-v3-q8_0.gguf \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;auto&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;7980&amp;lt;/font&amp;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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Parakeet est suffisamment léger pour fonctionner correctement sur CPU avec l’option &amp;lt;code&amp;gt;-ng&amp;lt;/code&amp;gt;. Il est également possible de définir le nombre de threads CPU utilisés avec l’option &amp;lt;code&amp;gt;-t &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;N&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; ; la valeur par défaut est de 4.&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;
La variable &amp;lt;code&amp;gt;Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; est facultative. Elle permet d’activer l’authentification par clé API sur le serveur CrispASR. Pour une utilisation avec Hermes, la valeur configurée ici doit être strictement identique à celle définie dans &amp;lt;code&amp;gt;VOICE_TOOLS_OPENAI_KEY&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Text-to-Speech ====&lt;br /&gt;
===== [https://huggingface.co/cstr/qwen3-tts-1.7b-base-GGUF Qwen3-TTS-12Hz-1.7B-Base] =====&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/qwen3-tts-1.7b-base-GGUF --include &amp;quot;*q8*.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0&lt;br /&gt;
 # hf download cstr/qwen3-tts-tokenizer-12hz-GGUF --include &amp;quot;qwen3-tts-tokenizer-12hz.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend qwen3-tts \&lt;br /&gt;
     -m /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0/qwen3-tts-12hz-1.7b-base-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0/qwen3-tts-tokenizer-12hz.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-pad-silence-ms &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-cfg-scale &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-steps &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Ce modèle est fourni sans voix. Il est donc nécessaire de placer un fichier WAV ainsi que sa transcription au format TXT dans le dossier &amp;lt;code&amp;gt;/opt/voices&amp;lt;/code&amp;gt; (par exemple : &amp;lt;code&amp;gt;henriette.wav&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;henriette.txt&amp;lt;/code&amp;gt;).&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;
La variable &amp;lt;code&amp;gt;Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; est facultative. Elle permet d’activer l’authentification par clé API sur le serveur CrispASR. Pour une utilisation avec Hermes, la valeur configurée ici doit être strictement identique à celle définie dans &amp;lt;code&amp;gt;VOICE_TOOLS_OPENAI_KEY&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-pad-silence-ms&amp;lt;/code&amp;gt; : Ajoute un silence au début du fichier audio généré. Utile pour compenser le buffer de lecture, le resampling ou les artefacts de démarrage du codec. Mesure en millisecondes. Par défaut 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-cfg-scale&amp;lt;/code&amp;gt; : Échelle de guidance classifier-free pour la synthèse vocale. Contrôle à quel point le modèle suit strictement le texte et la voix de référence. Valeur &amp;gt;1 renforce la fidélité, valeur &amp;lt;1 donne plus de liberté créative.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;---tts-steps&amp;lt;/code&amp;gt; : nombre d’étapes de diffusion/ODE. Plus = plus lent mais plus propre.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== [https://huggingface.co/cstr/qwen3-tts-0.6b-base-GGUF Qwen3-TTS-12Hz-0.6B-Base] =====&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/qwen3-tts-0.6b-base-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0&lt;br /&gt;
 # hf download cstr/qwen3-tts-tokenizer-12hz-GGUF --include &amp;quot;qwen3-tts-tokenizer-12hz.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend qwen3-tts \&lt;br /&gt;
     -m /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0/qwen3-tts-12hz-0.6b-base-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0/qwen3-tts-tokenizer-12hz.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-pad-silence-ms &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;200&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-cfg-scale &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-steps &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Ce modèle est fourni sans voix. Il est donc nécessaire de placer un fichier WAV ainsi que sa transcription au format TXT dans le dossier &amp;lt;code&amp;gt;/opt/voices&amp;lt;/code&amp;gt; (par exemple : &amp;lt;code&amp;gt;henriette.wav&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;henriette.txt&amp;lt;/code&amp;gt;).&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;
La variable &amp;lt;code&amp;gt;Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; est facultative. Elle permet d’activer l’authentification par clé API sur le serveur CrispASR. Pour une utilisation avec Hermes, la valeur configurée ici doit être strictement identique à celle définie dans &amp;lt;code&amp;gt;VOICE_TOOLS_OPENAI_KEY&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-pad-silence-ms&amp;lt;/code&amp;gt; : Ajoute un silence au début du fichier audio généré. Utile pour compenser le buffer de lecture, le resampling ou les artefacts de démarrage du codec. Mesure en millisecondes. Par défaut 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-cfg-scale&amp;lt;/code&amp;gt; : Échelle de guidance classifier-free pour la synthèse vocale. Contrôle à quel point le modèle suit strictement le texte et la voix de référence. Valeur &amp;gt;1 renforce la fidélité, valeur &amp;lt;1 donne plus de liberté créative.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;---tts-steps&amp;lt;/code&amp;gt; : nombre d’étapes de diffusion/ODE. Plus = plus lent mais plus propre.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== [https://huggingface.co/cstr/chatterbox-GGUF Chatterbox] =====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Informations vérifiées le 23/07/2026. La compatibilité avec CrispASR semble actuellement limitée. Le modèle est trop lourd pour une utilisation en temps réel avec un chatbot, mais offre une très bonne qualité audio.&lt;br /&gt;
}}&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/chatterbox-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/tts/chatterbox-GGUF/q8_0&lt;br /&gt;
-----&lt;br /&gt;
* Installer des voix :&lt;br /&gt;
 # mkdir /opt/voices&lt;br /&gt;
Fichier &amp;lt;code&amp;gt;.wav&amp;lt;/code&amp;gt; avec un nom de personnalité dans le dossier &amp;lt;code&amp;gt;/opt/voices&amp;lt;/code&amp;gt;&lt;br /&gt;
Optionnellement on joint le fichier de la transcription exacte de l’enregistrement, exemple :&lt;br /&gt;
 # vi /opt/voices/&amp;lt;font color = blue&amp;gt;henriette&amp;lt;/font&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
 bla bla bla&lt;br /&gt;
&lt;br /&gt;
GGUF : :&lt;br /&gt;
 cd /opt/CrispASR&lt;br /&gt;
 python3 -m venv .venv-chatterbox&lt;br /&gt;
 source .venv-chatterbox/bin/activate&lt;br /&gt;
 pip install --upgrade pip&lt;br /&gt;
 pip install numpy&lt;br /&gt;
 source /opt/CrispASR/.venv-chatterbox/bin/activate&lt;br /&gt;
 pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu128&lt;br /&gt;
 pip install chatterbox-tts&lt;br /&gt;
 pip install gguf&lt;br /&gt;
&lt;br /&gt;
 # python models/bake-chatterbox-voice-from-wav.py --input /opt/voices/henriette.wav --output /opt/voices/henriette.gguf&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend chatterbox \&lt;br /&gt;
     -m /opt/models/tts/chatterbox-GGUF/q8_0/chatterbox-t3-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/chatterbox-GGUF/q8_0/chatterbox-s3gen-q8_0.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;
===== [https://huggingface.co/cstr/omnivoice-GGUF OmniVoice] =====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Informations vérifiées le 23/07/2026. Basé sur Qwen3-TTS, ce modèle offre des performances et une qualité similaires, mais ne semble pas capable de conserver une voix fixe, probablement en raison d’un bug.&lt;br /&gt;
}}&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/omnivoice-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/tts/omnivoice-GGUF/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend omnivoice \&lt;br /&gt;
     -m /opt/models/tts/omnivoice-GGUF/q8_0/omnivoice-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/omnivoice-GGUF/q8_0/omnivoice-tokenizer-q8_0.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=CrispASR&amp;diff=5094</id>
		<title>CrispASR</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=CrispASR&amp;diff=5094"/>
		<updated>2026-10-23T17:57:32Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
&lt;br /&gt;
* On récupère le projet :&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone --recurse-submodules &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/CrispStrobe/CrispASR&lt;br /&gt;
 # cd CrispASR&lt;br /&gt;
* On installe quelques dépendances avant la compilation ( activer [[Debian_APT#Dépôts_contrib_et_non-free|les dépôts contrib et non-free]] si nécessaire) :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install libopencore-amrnb-dev libopencore-amrwb-dev libopus-dev libopusfile-dev libopenblas-dev ccache libfdk-aac-dev libsentencepiece-dev sentencepiece libopenblas-dev libnccl2 libnccl-dev libmp3lame-dev ffmepg&lt;br /&gt;
 # ln -s /usr/lib/x86_64-linux-gnu/libopenblas.so /usr/local/lib/libcblas.so&lt;br /&gt;
 # ldconfig&lt;br /&gt;
* On configure la compilation en choisissant le backend adapté au matériel utilisé.&lt;br /&gt;
&lt;br /&gt;
Version CPU :&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release&lt;br /&gt;
&lt;br /&gt;
Version NVIDIA avec CUDA — nécessite l’installation préalable du CUDA Toolkit :&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON -DGGML_LTO=ON&lt;br /&gt;
&lt;br /&gt;
Version Apple Silicon avec Metal :&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_METAL=ON&lt;br /&gt;
&lt;br /&gt;
Version Vulkan — nécessite l’installation préalable des bibliothèques et outils de développement Vulkan :&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_VULKAN=ON&lt;br /&gt;
&lt;br /&gt;
* On lance ensuite la compilation :&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les exécutables sont générés dans le répertoire &amp;lt;code&amp;gt;/opt/CrispASR/build/bin/&amp;lt;/code&amp;gt;.&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd /opt/CrispASR/&lt;br /&gt;
 # rm -r build&lt;br /&gt;
 # git pull --recurse-submodules&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON -DGGML_LTO=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Exemples ===&lt;br /&gt;
==== Speech-to-Text ====&lt;br /&gt;
===== [https://huggingface.co/cstr/parakeet-tdt-0.6b-v3-GGUF cstr/parakeet-tdt-0.6b-v3-GGUF] =====&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/parakeet-tdt-0.6b-v3-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/stt/parakeet-tdt-0.6b-v3/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-stt.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Speech-to-Text Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend parakeet \&lt;br /&gt;
     -m /opt/models/stt/parakeet-tdt-0.6b-v3/q8_0/parakeet-tdt-0.6b-v3-q8_0.gguf \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;auto&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color = blue&amp;gt;7980&amp;lt;/font&amp;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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Parakeet est suffisamment léger pour fonctionner correctement sur CPU avec l’option &amp;lt;code&amp;gt;-ng&amp;lt;/code&amp;gt;. Il est également possible de définir le nombre de threads CPU utilisés avec l’option &amp;lt;code&amp;gt;-t &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;N&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; ; la valeur par défaut est de 4.&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;
La variable &amp;lt;code&amp;gt;Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; est facultative. Elle permet d’activer l’authentification par clé API sur le serveur CrispASR. Pour une utilisation avec Hermes, la valeur configurée ici doit être strictement identique à celle définie dans &amp;lt;code&amp;gt;VOICE_TOOLS_OPENAI_KEY&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Text-to-Speech ====&lt;br /&gt;
===== [https://huggingface.co/cstr/qwen3-tts-1.7b-base-GGUF Qwen3-TTS-12Hz-1.7B-Base] =====&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/qwen3-tts-1.7b-base-GGUF --include &amp;quot;*q8*.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0&lt;br /&gt;
 # hf download cstr/qwen3-tts-tokenizer-12hz-GGUF --include &amp;quot;qwen3-tts-tokenizer-12hz.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend qwen3-tts \&lt;br /&gt;
     -m /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0/qwen3-tts-12hz-1.7b-base-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/qwen3-tts-1.7b-base-GGUF/q8_0/qwen3-tts-tokenizer-12hz.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-pad-silence-ms &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-cfg-scale &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-steps &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Ce modèle est fourni sans voix. Il est donc nécessaire de placer un fichier WAV ainsi que sa transcription au format TXT dans le dossier &amp;lt;code&amp;gt;/opt/voices&amp;lt;/code&amp;gt; (par exemple : &amp;lt;code&amp;gt;henriette.wav&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;henriette.txt&amp;lt;/code&amp;gt;).&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;
La variable &amp;lt;code&amp;gt;Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; est facultative. Elle permet d’activer l’authentification par clé API sur le serveur CrispASR. Pour une utilisation avec Hermes, la valeur configurée ici doit être strictement identique à celle définie dans &amp;lt;code&amp;gt;VOICE_TOOLS_OPENAI_KEY&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-pad-silence-ms&amp;lt;/code&amp;gt; : Ajoute un silence au début du fichier audio généré. Utile pour compenser le buffer de lecture, le resampling ou les artefacts de démarrage du codec. Mesure en millisecondes. Par défaut 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-cfg-scale&amp;lt;/code&amp;gt; : Échelle de guidance classifier-free pour la synthèse vocale. Contrôle à quel point le modèle suit strictement le texte et la voix de référence. Valeur &amp;gt;1 renforce la fidélité, valeur &amp;lt;1 donne plus de liberté créative.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;---tts-steps&amp;lt;/code&amp;gt; : nombre d’étapes de diffusion/ODE. Plus = plus lent mais plus propre.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== [https://huggingface.co/cstr/qwen3-tts-0.6b-base-GGUF Qwen3-TTS-12Hz-0.6B-Base] =====&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/qwen3-tts-0.6b-base-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0&lt;br /&gt;
 # hf download cstr/qwen3-tts-tokenizer-12hz-GGUF --include &amp;quot;qwen3-tts-tokenizer-12hz.gguf&amp;quot; --local-dir /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend qwen3-tts \&lt;br /&gt;
     -m /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0/qwen3-tts-12hz-0.6b-base-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/qwen3-tts-0.6b-base-GGUF/q8_0/qwen3-tts-tokenizer-12hz.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-pad-silence-ms &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;200&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-cfg-scale &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --tts-steps &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Ce modèle est fourni sans voix. Il est donc nécessaire de placer un fichier WAV ainsi que sa transcription au format TXT dans le dossier &amp;lt;code&amp;gt;/opt/voices&amp;lt;/code&amp;gt; (par exemple : &amp;lt;code&amp;gt;henriette.wav&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;henriette.txt&amp;lt;/code&amp;gt;).&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;
La variable &amp;lt;code&amp;gt;Environment=&amp;quot;CRISPASR_API_KEYS=&amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; est facultative. Elle permet d’activer l’authentification par clé API sur le serveur CrispASR. Pour une utilisation avec Hermes, la valeur configurée ici doit être strictement identique à celle définie dans &amp;lt;code&amp;gt;VOICE_TOOLS_OPENAI_KEY&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-pad-silence-ms&amp;lt;/code&amp;gt; : Ajoute un silence au début du fichier audio généré. Utile pour compenser le buffer de lecture, le resampling ou les artefacts de démarrage du codec. Mesure en millisecondes. Par défaut 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--tts-cfg-scale&amp;lt;/code&amp;gt; : Échelle de guidance classifier-free pour la synthèse vocale. Contrôle à quel point le modèle suit strictement le texte et la voix de référence. Valeur &amp;gt;1 renforce la fidélité, valeur &amp;lt;1 donne plus de liberté créative.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;---tts-steps&amp;lt;/code&amp;gt; : nombre d’étapes de diffusion/ODE. Plus = plus lent mais plus propre.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== [https://huggingface.co/cstr/chatterbox-GGUF Chatterbox] =====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Informations vérifiées le 23/07/2026. La compatibilité avec CrispASR semble actuellement limitée. Le modèle est trop lourd pour une utilisation en temps réel avec un chatbot, mais offre une très bonne qualité audio.&lt;br /&gt;
}}&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/chatterbox-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/tts/chatterbox-GGUF/q8_0&lt;br /&gt;
-----&lt;br /&gt;
* Installer des voix :&lt;br /&gt;
 # mkdir /opt/voices&lt;br /&gt;
Fichier &amp;lt;code&amp;gt;.wav&amp;lt;/code&amp;gt; avec un nom de personnalité dans le dossier &amp;lt;code&amp;gt;/opt/voices&amp;lt;/code&amp;gt;&lt;br /&gt;
Optionnellement on joint le fichier de la transcription exacte de l’enregistrement, exemple :&lt;br /&gt;
 # vi /opt/voices/&amp;lt;font color = blue&amp;gt;henriette&amp;lt;/font&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
 bla bla bla&lt;br /&gt;
&lt;br /&gt;
GGUF : :&lt;br /&gt;
 cd /opt/CrispASR&lt;br /&gt;
 python3 -m venv .venv-chatterbox&lt;br /&gt;
 source .venv-chatterbox/bin/activate&lt;br /&gt;
 pip install --upgrade pip&lt;br /&gt;
 pip install numpy&lt;br /&gt;
 source /opt/CrispASR/.venv-chatterbox/bin/activate&lt;br /&gt;
 pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu128&lt;br /&gt;
 pip install chatterbox-tts&lt;br /&gt;
 pip install gguf&lt;br /&gt;
&lt;br /&gt;
 # python models/bake-chatterbox-voice-from-wav.py --input /opt/voices/henriette.wav --output /opt/voices/henriette.gguf&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend chatterbox \&lt;br /&gt;
     -m /opt/models/tts/chatterbox-GGUF/q8_0/chatterbox-t3-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/chatterbox-GGUF/q8_0/chatterbox-s3gen-q8_0.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;
===== [https://huggingface.co/cstr/omnivoice-GGUF OmniVoice] =====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = important&lt;br /&gt;
  | texte  =&lt;br /&gt;
Informations vérifiées le 23/07/2026. Basé sur Qwen3-TTS, ce modèle offre des performances et une qualité similaires, mais ne semble pas capable de conserver une voix fixe, probablement en raison d’un bug.&lt;br /&gt;
}}&lt;br /&gt;
Voir [[Client_Hugging_Face|Client Hugging Face]]&lt;br /&gt;
 # hf download cstr/omnivoice-GGUF --include &amp;quot;*q8_0*.gguf&amp;quot; --local-dir /opt/models/tts/omnivoice-GGUF/q8_0&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/crispasr-tts.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=CrispASR Text-to-Speech Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 WorkingDirectory=/opt/CrispASR&lt;br /&gt;
 ExecStart=/opt/CrispASR/build/bin/crispasr \&lt;br /&gt;
     --server \&lt;br /&gt;
     --backend omnivoice \&lt;br /&gt;
     -m /opt/models/tts/omnivoice-GGUF/q8_0/omnivoice-q8_0.gguf \&lt;br /&gt;
     --codec-model /opt/models/tts/omnivoice-GGUF/q8_0/omnivoice-tokenizer-q8_0.gguf \&lt;br /&gt;
     --voice-dir /opt/voices \&lt;br /&gt;
     --i-have-rights \&lt;br /&gt;
     --language &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;fr&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --host &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
     --port &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7981&amp;lt;/font&amp;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;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5093</id>
		<title>Llama-swap</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5093"/>
		<updated>2026-10-22T20:43:30Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Strata Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S */&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_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 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: 155648&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&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 512&lt;br /&gt;
       -ub 512&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 2048&lt;br /&gt;
       -ub 512&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 512&lt;br /&gt;
       -ub 512&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 Llama.cpp kvcache Q8) Généraliste dense rapide ====&lt;br /&gt;
 # hf download unsloth/Muse-Glimmer-30B-GGUF --include &amp;quot;*UD-Q5_K_L*.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-Q5_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;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: 262144&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-Q5_K_L/Muse-Glimmer-30B-UD-Q5_K_L.gguf&lt;br /&gt;
       --spec-type draft-dflash,ngram-mod&lt;br /&gt;
       --spec-draft-model /opt/models/Muse-Glimmer-30B-GGUF/UD-Q5_K_L/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:262144,dflash.context_length=int:262144&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 tensor&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 512&lt;br /&gt;
       -ub 256&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-Q5_K_L/mmproj-Muse-Glimmer-30B-Q8_0.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
==== [[Strata|Strata]] Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S ====&lt;br /&gt;
   &amp;quot;Qwen3.8-Flash-Next&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Qwen3.8-Flash-Next&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: 262144&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /bin/bash -lc &#039;cd /opt/Strata &amp;amp;&amp;amp; exec env STRATA_DECODE_TIMING=1 STRATA_VERIFY_PROFILE=1 .venv/bin/python -m serve.server --engine strata --config /opt/Strata/strata-iq3_s.json --port ${PORT}&#039;&lt;br /&gt;
       --engine strata&lt;br /&gt;
       --config /opt/Strata/strata-iq3_s.json&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
 &lt;br /&gt;
     proxy: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;127.0.0.1:${PORT}&amp;quot;&lt;br /&gt;
     checkEndpoint: /health&lt;br /&gt;
&lt;br /&gt;
=== En test ===&lt;br /&gt;
==== [[Beellama.cpp#Qwen3.8-27B_Context_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 Kvarn6/Kvarn6 (2x 12 Go de VRAM)]] Spécialiste codeur lent ====&lt;br /&gt;
&lt;br /&gt;
 # sudo hf download unsloth/Qwen3.8-27B-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.8-27B/UD-Q4_K_XL&lt;br /&gt;
 # sudo hf download froggeric/Qwen-Fixed-Chat-Templates --include &amp;quot;*chat_template.jinja*&amp;quot; --local-dir /opt/models/Qwen-Fixed-Chat-Templates&lt;br /&gt;
 # sudo hf download incoai/Qwen3.8-27B-DFlash2-GGUF --include &amp;quot;*Q4*&amp;quot; --local-dir /opt/models/Qwen3.8-27B-Dflash2&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;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: 155648&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;
       --mmproj-offload&lt;br /&gt;
       --mmproj-device CUDA0&lt;br /&gt;
       --image-min-tokens 1024&lt;br /&gt;
       -dev CUDA1,CUDA2&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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-dflash&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/Qwen3.8-27B-Dflash2/Qwen3.8-27B-DFlash2-Q4_K_M.gguf&lt;br /&gt;
       --spec-draft-device CUDA0&lt;br /&gt;
       --spec-draft-ngl all&lt;br /&gt;
       --spec-draft-n-max 7&lt;br /&gt;
       --spec-draft-n-min 0&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5092</id>
		<title>Llama-swap</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5092"/>
		<updated>2026-10-22T20:43:15Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Exemples de modèles */&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_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 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: 155648&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&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 512&lt;br /&gt;
       -ub 512&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 2048&lt;br /&gt;
       -ub 512&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 512&lt;br /&gt;
       -ub 512&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 Llama.cpp kvcache Q8) Généraliste dense rapide ====&lt;br /&gt;
 # hf download unsloth/Muse-Glimmer-30B-GGUF --include &amp;quot;*UD-Q5_K_L*.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-Q5_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;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: 262144&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-Q5_K_L/Muse-Glimmer-30B-UD-Q5_K_L.gguf&lt;br /&gt;
       --spec-type draft-dflash,ngram-mod&lt;br /&gt;
       --spec-draft-model /opt/models/Muse-Glimmer-30B-GGUF/UD-Q5_K_L/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:262144,dflash.context_length=int:262144&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 tensor&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 512&lt;br /&gt;
       -ub 256&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-Q5_K_L/mmproj-Muse-Glimmer-30B-Q8_0.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
==== [[Strata|Strata]] Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S ====&lt;br /&gt;
   &amp;quot;Qwen3.8-Flash-Next&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Qwen3.8-Flash-Next&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: 262144&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /bin/bash -lc &#039;cd /opt/Strata &amp;amp;&amp;amp; exec env STRATA_DECODE_TIMING=1 STRATA_VERIFY_PROFILE=1 .venv/bin/python -m serve.server --engine strata --config /opt/Strata/strata-iq3_s.json --port ${PORT}&#039;&lt;br /&gt;
       --engine strata&lt;br /&gt;
       --config /opt/Strata/strata-iq3_s.json&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
 &lt;br /&gt;
     proxy: &amp;quot;http://127.0.0.1:${PORT}&amp;quot;&lt;br /&gt;
     checkEndpoint: /health&lt;br /&gt;
&lt;br /&gt;
=== En test ===&lt;br /&gt;
==== [[Beellama.cpp#Qwen3.8-27B_Context_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 Kvarn6/Kvarn6 (2x 12 Go de VRAM)]] Spécialiste codeur lent ====&lt;br /&gt;
&lt;br /&gt;
 # sudo hf download unsloth/Qwen3.8-27B-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.8-27B/UD-Q4_K_XL&lt;br /&gt;
 # sudo hf download froggeric/Qwen-Fixed-Chat-Templates --include &amp;quot;*chat_template.jinja*&amp;quot; --local-dir /opt/models/Qwen-Fixed-Chat-Templates&lt;br /&gt;
 # sudo hf download incoai/Qwen3.8-27B-DFlash2-GGUF --include &amp;quot;*Q4*&amp;quot; --local-dir /opt/models/Qwen3.8-27B-Dflash2&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;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: 155648&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;
       --mmproj-offload&lt;br /&gt;
       --mmproj-device CUDA0&lt;br /&gt;
       --image-min-tokens 1024&lt;br /&gt;
       -dev CUDA1,CUDA2&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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-dflash&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/Qwen3.8-27B-Dflash2/Qwen3.8-27B-DFlash2-Q4_K_M.gguf&lt;br /&gt;
       --spec-draft-device CUDA0&lt;br /&gt;
       --spec-draft-ngl all&lt;br /&gt;
       --spec-draft-n-max 7&lt;br /&gt;
       --spec-draft-n-min 0&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5091</id>
		<title>Llama-swap</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5091"/>
		<updated>2026-10-22T20:42:51Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Strata unsloth-ud-iq3_s */&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_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 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: 155648&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&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 512&lt;br /&gt;
       -ub 512&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 2048&lt;br /&gt;
       -ub 512&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 512&lt;br /&gt;
       -ub 512&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 Llama.cpp kvcache Q8) Généraliste dense rapide ====&lt;br /&gt;
 # hf download unsloth/Muse-Glimmer-30B-GGUF --include &amp;quot;*UD-Q5_K_L*.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-Q5_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;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: 262144&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-Q5_K_L/Muse-Glimmer-30B-UD-Q5_K_L.gguf&lt;br /&gt;
       --spec-type draft-dflash,ngram-mod&lt;br /&gt;
       --spec-draft-model /opt/models/Muse-Glimmer-30B-GGUF/UD-Q5_K_L/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:262144,dflash.context_length=int:262144&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 tensor&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 512&lt;br /&gt;
       -ub 256&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-Q5_K_L/mmproj-Muse-Glimmer-30B-Q8_0.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
=== En test ===&lt;br /&gt;
==== [[Beellama.cpp#Qwen3.8-27B_Context_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 Kvarn6/Kvarn6 (2x 12 Go de VRAM)]] Spécialiste codeur lent ====&lt;br /&gt;
&lt;br /&gt;
 # sudo hf download unsloth/Qwen3.8-27B-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.8-27B/UD-Q4_K_XL&lt;br /&gt;
 # sudo hf download froggeric/Qwen-Fixed-Chat-Templates --include &amp;quot;*chat_template.jinja*&amp;quot; --local-dir /opt/models/Qwen-Fixed-Chat-Templates&lt;br /&gt;
 # sudo hf download incoai/Qwen3.8-27B-DFlash2-GGUF --include &amp;quot;*Q4*&amp;quot; --local-dir /opt/models/Qwen3.8-27B-Dflash2&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;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: 155648&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;
       --mmproj-offload&lt;br /&gt;
       --mmproj-device CUDA0&lt;br /&gt;
       --image-min-tokens 1024&lt;br /&gt;
       -dev CUDA1,CUDA2&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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-dflash&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/Qwen3.8-27B-Dflash2/Qwen3.8-27B-DFlash2-Q4_K_M.gguf&lt;br /&gt;
       --spec-draft-device CUDA0&lt;br /&gt;
       --spec-draft-ngl all&lt;br /&gt;
       --spec-draft-n-max 7&lt;br /&gt;
       --spec-draft-n-min 0&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5090</id>
		<title>Llama-swap</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama-swap&amp;diff=5090"/>
		<updated>2026-10-22T20:41:15Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Strata unsloth-ud-iq4_xs */&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_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 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: 155648&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&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 512&lt;br /&gt;
       -ub 512&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 2048&lt;br /&gt;
       -ub 512&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 512&lt;br /&gt;
       -ub 512&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 Llama.cpp kvcache Q8) Généraliste dense rapide ====&lt;br /&gt;
 # hf download unsloth/Muse-Glimmer-30B-GGUF --include &amp;quot;*UD-Q5_K_L*.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-Q5_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;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: 262144&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-Q5_K_L/Muse-Glimmer-30B-UD-Q5_K_L.gguf&lt;br /&gt;
       --spec-type draft-dflash,ngram-mod&lt;br /&gt;
       --spec-draft-model /opt/models/Muse-Glimmer-30B-GGUF/UD-Q5_K_L/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:262144,dflash.context_length=int:262144&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 tensor&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 512&lt;br /&gt;
       -ub 256&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-Q5_K_L/mmproj-Muse-Glimmer-30B-Q8_0.gguf&lt;br /&gt;
       --no-mmproj-offload&lt;br /&gt;
=== En test ===&lt;br /&gt;
==== [[Strata|Strata]] unsloth-ud-iq3_s ====&lt;br /&gt;
   &amp;quot;Qwen3.8-Flash-Next&amp;quot;:&lt;br /&gt;
     name: &amp;quot;Qwen3.8-Flash-Next&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: 262144&lt;br /&gt;
 &lt;br /&gt;
     cmd: |&lt;br /&gt;
       /bin/bash -lc &#039;cd /opt/Strata &amp;amp;&amp;amp; exec env STRATA_DECODE_TIMING=1 STRATA_VERIFY_PROFILE=1 .venv/bin/python -m serve.server --engine strata --config /opt/Strata/strata-iq3_s.json --port ${PORT}&#039;&lt;br /&gt;
       --engine strata&lt;br /&gt;
       --config /opt/Strata/strata-iq3_s.json&lt;br /&gt;
       --port ${PORT}&lt;br /&gt;
 &lt;br /&gt;
     proxy: &amp;quot;http://127.0.0.1:${PORT}&amp;quot;&lt;br /&gt;
     checkEndpoint: /health&lt;br /&gt;
&lt;br /&gt;
==== [[Beellama.cpp#Qwen3.8-27B_Context_155648_Kvarn6/Kvarn6_-_tail_1024_-_MTP_+_n-gam_(2x_12_Go_de_VRAM)|Qwen3.8-27B-GGUF Context 155648 Kvarn6/Kvarn6 (2x 12 Go de VRAM)]] Spécialiste codeur lent ====&lt;br /&gt;
&lt;br /&gt;
 # sudo hf download unsloth/Qwen3.8-27B-GGUF --include &amp;quot;*UD-Q4_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.8-27B/UD-Q4_K_XL&lt;br /&gt;
 # sudo hf download froggeric/Qwen-Fixed-Chat-Templates --include &amp;quot;*chat_template.jinja*&amp;quot; --local-dir /opt/models/Qwen-Fixed-Chat-Templates&lt;br /&gt;
 # sudo hf download incoai/Qwen3.8-27B-DFlash2-GGUF --include &amp;quot;*Q4*&amp;quot; --local-dir /opt/models/Qwen3.8-27B-Dflash2&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;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: 155648&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;
       --mmproj-offload&lt;br /&gt;
       --mmproj-device CUDA0&lt;br /&gt;
       --image-min-tokens 1024&lt;br /&gt;
       -dev CUDA1,CUDA2&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 512&lt;br /&gt;
       -ub 512&lt;br /&gt;
       -c 155648&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-dflash&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/Qwen3.8-27B-Dflash2/Qwen3.8-27B-DFlash2-Q4_K_M.gguf&lt;br /&gt;
       --spec-draft-device CUDA0&lt;br /&gt;
       --spec-draft-ngl all&lt;br /&gt;
       --spec-draft-n-max 7&lt;br /&gt;
       --spec-draft-n-min 0&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;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
froggeric/Qwen-Fixed-Chat-Templates : Support complet des balises &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_low|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_medium|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;|think_xhigh|&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; pour contrôler le niveau de raisonnement directement dans le prompt.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5089</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=5089"/>
		<updated>2026-10-21T22:02:38Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Changer le mode d&amp;#039;approbation des commandes */&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 / VM recommandée)&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;
&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 backend Hermes ===&lt;br /&gt;
Le backend Hermes expose les API utilisées notamment par le Dashboard, [[Hermes#Hermes_Workspace|Hermes Worspace]], [https://hermes-ai.net/desktop/ Hermes Desktop], les sessions, skills, configuration, jobs et certaines fonctions MCP.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;hermes serve&amp;lt;/code&amp;gt; permet de lancer ce backend en mode headless, sans ouvrir l&#039;interface web du Dashboard.&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 &amp;quot;from plugins.dashboard_auth.basic import hash_password; print(hash_password(&#039;&amp;lt;font color = blue&amp;gt;MON_MOT_DE_PASSE&amp;lt;/font&amp;gt;&#039;))&amp;quot;&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 :&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 backend Hermes donne accès à des fonctions sensibles. 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 active la protection par 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 backend après Hermes Gateway :&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/systemd/system/hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Ajouter :&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes Backend&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;
 EnvironmentFile=/root/.hermes/.env&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 serve --host &amp;lt;font color = blue&amp;gt;IP_BACKEND_HERMES&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;9119&amp;lt;/font&amp;gt;&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_BACKEND_HERMES&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par l’adresse locale de l’interface réseau sur laquelle le backend 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;
On active le plugin pour authentifier le dashboard :&lt;br /&gt;
 # hermes plugins enable dashboard_auth/basic&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-backend.service&lt;br /&gt;
&lt;br /&gt;
On le démarre :&lt;br /&gt;
 # systemctl start hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour vérifier son état :&lt;br /&gt;
 # systemctl status hermes-backend.service&lt;br /&gt;
&lt;br /&gt;
Pour suivre les logs :&lt;br /&gt;
 # journalctl -u hermes-backend.service -f&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le backend écoute :&lt;br /&gt;
 # ss -lntp | grep 9119&lt;br /&gt;
&lt;br /&gt;
Pour tester son API :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP_HERMES:9119/api/status&lt;br /&gt;
&lt;br /&gt;
Pour ouvrir l&#039;interface web d&#039;administration, on peut toujours utiliser :&lt;br /&gt;
 # 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;
=== 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;
=== Installer les dépendances pour la voix du CLI ===&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette étape est utile uniquement si le CLI est exécuté localement sur le serveur Hermes Agent, avec un microphone et des haut-parleurs accessibles.&lt;br /&gt;
 }}&lt;br /&gt;
 # cd ~/.hermes/hermes-agent&lt;br /&gt;
 # uv pip install --python ./venv/bin/python -e &amp;quot;.[voice]&amp;quot;&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install libportaudio2&lt;br /&gt;
==== LXC ====&lt;br /&gt;
Voir [[Audio_Passthrough|audio passthrough]]&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;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Procédure d&#039;installation via &amp;lt;code&amp;gt;Docker&amp;lt;/code&amp;gt; (non recommandée)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;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;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&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;
On s&#039;assure que Java 25 est la version utilisée par défaut :&lt;br /&gt;
 # update-alternatives --set java /usr/lib/jvm/java-25-openjdk-amd64/bin/java&lt;br /&gt;
 # java -version&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt; retourne une erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, vérifier la version de Java actuellement utilisée avec &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt;. Installer si nécessaire la version requise avec &amp;lt;code&amp;gt;apt install openjdk-XX-jre-headless&amp;lt;/code&amp;gt;, puis la sélectionner avec &amp;lt;code&amp;gt;update-alternatives --config java&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;
 Environment=&amp;quot;JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64&amp;quot;&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;
&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;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; : génération d’une spécification détaillée à partir d’une tâche placée dans le Triage du Kanban (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;memory_query_rewrite&amp;lt;/code&amp;gt; : reformulation des requêtes destinées aux systèmes de mémoire afin d&#039;améliorer la pertinence de la recherche (LLM texte léger)&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : évaluation de l&#039;état d&#039;un objectif actif afin de déterminer s&#039;il est terminé, doit continuer ou doit attendre (LLM texte léger et fiable)&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Dans les versions récentes de Hermes, &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; n&#039;utilise plus de modèle auxiliaire, &amp;lt;code&amp;gt;session_search&amp;lt;/code&amp;gt; effectue directement ses recherches dans les sessions sans appel LLM et &amp;lt;code&amp;gt;flush_memories&amp;lt;/code&amp;gt; a été supprimé. Ces trois anciennes entrées n&#039;ont donc plus à être configurées dans &amp;lt;code&amp;gt;auxiliary&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&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;compression&amp;lt;/code&amp;gt; : recommandé avec un modèle texte disposant d’un contexte long et de bonnes capacités de résumé. Un petit modèle rapide peut convenir si sa qualité et sa fenêtre de contexte sont suffisantes.&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). É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;monitor&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;memory_query_rewrite&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;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide mais fiable (environ 1 à 4 milliards de paramètres). La sortie est courte et structurée ; un modèle rapide convient bien s&#039;il respecte correctement les consignes et le format demandé.&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; : petit modèle texte très rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; : petit modèle texte rapide&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; : petit modèle texte rapide et fiable&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; : modèle disposant d’un contexte long et 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 et reasoning recommandés 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. Il est donc préférable d’adapter le contexte à chaque fonction plutôt que d’utiliser une valeur unique « confortable » pour toutes les routes.&lt;br /&gt;
&lt;br /&gt;
Hermes permet également de contrôler le niveau de reasoning indépendamment pour chaque tâche auxiliaire avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  vision:&lt;br /&gt;
    reasoning_effort: &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  compression:&lt;br /&gt;
    reasoning_effort: &amp;quot;low&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les valeurs disponibles sont :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xhigh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une valeur vide ou absente laisse le provider choisir son comportement par défaut.&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
 | niveau = information&lt;br /&gt;
 | icône = loupe&lt;br /&gt;
 | texte =&lt;br /&gt;
Certains modèles, comme LFM2.5-2.6B, ne permettent pas de sélectionner le niveau de raisonnement. Dans ce cas, laisser le champ vide.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fonction !! Contexte suggéré !! Reasoning suggéré !! Remarque&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Ne voit généralement que les premiers messages. Aucun raisonnement complexe nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt; || 2-4K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Annotation d’un passage de texte court. Le thinking apporte très peu.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Développe une tâche courte du Triage Kanban en spécification plus détaillée. Un reasoning profond est généralement inutile.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Reformulation courte destinée à améliorer la recherche mémoire ; aucun reasoning profond n&#039;est normalement nécessaire.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Évalue l&#039;objectif et la dernière réponse pour produire un verdict structuré. La fiabilité du respect du format est plus importante que la profondeur du reasoning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt; || 4-8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Recherche ou sélection de compétences. Un reasoning profond est inutile dans la majorité des cas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;minimal&amp;lt;/code&amp;gt; || Selon la taille des données surveillées. Le plus souvent détection/classification.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt; || 8K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Synthèse d’un historique modéré.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Analyse d’une action proposée et de son contexte. Conserver davantage de reasoning pour les décisions sensibles.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Dépend principalement du nombre et de la taille des définitions d’outils. Un peu de reasoning aide à sélectionner correctement l’outil.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt; || 8-16K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; || Décomposition d’un projet en tâches ; le reasoning peut réellement améliorer la structure.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; || 16K || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Recommandé pour description/OCR simple : le modèle principal peut effectuer le raisonnement ensuite. Passer à &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; pour diagrammes ou analyse visuelle complexe. Ajuster le contexte si usage OCR intensif.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Peut agréger plusieurs sources et doit sélectionner les éléments pertinents.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;background_review&amp;lt;/code&amp;gt; || 16-32K || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; / hérité || Si un modèle auxiliaire distinct est utilisé, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; est généralement suffisant. Un review fork utilisant le même modèle que l’agent hérite du reasoning du modèle principal.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_reference&amp;lt;/code&amp;gt; || 32K ou plus || Par preset || Le reasoning ne se configure pas via &amp;lt;code&amp;gt;auxiliary.moa_reference.reasoning_effort&amp;lt;/code&amp;gt;. Il se règle individuellement dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.reference_models[].reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; || 64-128K typiquement || &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; || Nécessite une fenêtre de contexte suffisamment grande pour recevoir le contenu à compresser.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt; || 64K minimum, souvent davantage || Par preset, généralement &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;high&amp;lt;/code&amp;gt; || Agrège plusieurs réponses longues et bénéficie réellement du reasoning. Le réglage se fait dans &amp;lt;code&amp;gt;moa.presets.&amp;amp;lt;nom&amp;amp;gt;.aggregator.reasoning_effort&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quand désactiver le reasoning =====&lt;br /&gt;
&lt;br /&gt;
Le reasoning peut généralement être désactivé avec &amp;lt;code&amp;gt;reasoning_effort: &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; lorsque la tâche consiste principalement à classer, annoter, extraire ou décrire des données sans prise de décision complexe.&lt;br /&gt;
&lt;br /&gt;
Bonnes candidates :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title_generation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tts_audio_tags&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;triage_specifier&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;goal_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;vision&amp;lt;/code&amp;gt; pour description ou OCR simple&lt;br /&gt;
* &amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;skills_hub&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les tâches de synthèse ou de décision, &amp;lt;code&amp;gt;low&amp;lt;/code&amp;gt; constitue généralement un meilleur compromis :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;profile_describer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;curator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches de planification ou d’agrégation complexe peuvent conserver &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; ou davantage :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kanban_decomposer&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;approval&amp;lt;/code&amp;gt; pour les décisions sensibles&lt;br /&gt;
* &amp;lt;code&amp;gt;moa_aggregator&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À noter que &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; est un raccourci Hermes. Si un &amp;lt;code&amp;gt;extra_body.reasoning&amp;lt;/code&amp;gt; explicite est également défini pour la même tâche, celui-ci est prioritaire.&lt;br /&gt;
&lt;br /&gt;
Pour le modèle principal, le réglage global reste :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
agent:&lt;br /&gt;
  reasoning_effort: &amp;quot;medium&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et peut être modifié temporairement dans une session avec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/reasoning none&lt;br /&gt;
/reasoning low&lt;br /&gt;
/reasoning medium&lt;br /&gt;
/reasoning high&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le réglage &amp;lt;code&amp;gt;/reasoning&amp;lt;/code&amp;gt; concerne le modèle principal ; il ne remplace pas les réglages &amp;lt;code&amp;gt;reasoning_effort&amp;lt;/code&amp;gt; propres aux tâches auxiliaires.&lt;br /&gt;
&lt;br /&gt;
===== Cas particulier de la compression =====&lt;br /&gt;
&lt;br /&gt;
Le contexte nécessaire pour &amp;lt;code&amp;gt;compression&amp;lt;/code&amp;gt; dépend directement du volume de contexte transmis au modèle auxiliaire.&lt;br /&gt;
&lt;br /&gt;
Le réglage général de la compression se fait dans :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.hermes/config.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
compression:&lt;br /&gt;
  enabled: true&lt;br /&gt;
  threshold: 0.50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;threshold&amp;lt;/code&amp;gt; représente une fraction de la fenêtre de contexte du modèle principal.&lt;br /&gt;
&lt;br /&gt;
Par exemple, avec un modèle principal configuré à 262144 tokens :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
262144 × 0.50 = 131072 tokens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La compression peut donc être déclenchée autour de 131K tokens.&lt;br /&gt;
&lt;br /&gt;
Le modèle auxiliaire lui-même se configure séparément :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auxiliary:&lt;br /&gt;
  compression:&lt;br /&gt;
    provider: auto&lt;br /&gt;
    model: NOM_DU_MODELE&lt;br /&gt;
    base_url: http://ADRESSE:PORT/v1&lt;br /&gt;
    api_key: CLE_API&lt;br /&gt;
    timeout: 120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé pour la compression doit disposer d&#039;une fenêtre de contexte suffisamment grande pour traiter les données que Hermes lui transmet.&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;un petit modèle local disposant malgré tout d&#039;un contexte long, comme LFM2.5-2.6B configuré à 128K, celui-ci peut être particulièrement intéressant grâce à son coût réduit et à sa vitesse élevée de traitement du prompt.&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;triage_specifier&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;memory_query_rewrite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;goal_judge&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;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 quantification ou &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; en KV cache partout par défaut sur les routes auxiliaires — risque de dégradation négligeable.&lt;br /&gt;
* &#039;&#039;&#039;À partir de 32K&#039;&#039;&#039; (&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; devient intéressant, avec un gain notable de mémoire pour un risque faible.&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) peut se justifier, vu le volume réel de KV cache à comprimer.&lt;br /&gt;
&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;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&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;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = loupe&lt;br /&gt;
| texte =&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;consent_attestation: &amp;quot;I have the speaker&#039;s consent&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; est nécessaire à l&#039;utilisation du clonage de voix.&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=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&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;
&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;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;local&amp;lt;/font&amp;gt;&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;
=== Changer le mode d&#039;approbation des commandes ===&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 approvals:&lt;br /&gt;
   mode: &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;manual&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer &amp;lt;code&amp;gt;manual&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;smart&amp;lt;/code&amp;gt; pour confier l’évaluation des commandes sensibles à un LLM. Les opérations jugées sûres sont automatiquement autorisées, les opérations dangereuses sont refusées et les cas incertains sont soumis à l’utilisateur. Par défaut, Hermes utilise le modèle principal pour cette évaluation, sauf si un modèle auxiliaire spécifique est configuré pour la tâche approval.&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://hermesatlas.com/skills/ Hermes Agent skills] : top selon le site hermes atlas&lt;br /&gt;
== [https://github.com/fathah/hermes-desktop Hermes Agent Desktop] ==&lt;br /&gt;
Pour accéder a toutes les fonctionnalités sur une connexion distante il est préférable de se connecter via SSH, sur le serveur Hermes Agent :&lt;br /&gt;
 # ssh-keygen -t ed25519 -f ~/.ssh/hermes_desktop&lt;br /&gt;
Ne PAS entrer de mot de passe :&lt;br /&gt;
 Enter passphrase for &amp;quot;/root/.ssh/hermes_desktop&amp;quot; (empty for no passphrase): &lt;br /&gt;
 Enter same passphrase again:&lt;br /&gt;
Ensuite, ajouter la clé publique aux clés autorisées du compte auquel Hermes Desktop doit se connecter :&lt;br /&gt;
 # cat ~/.ssh/hermes_desktop.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
 # chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
=== Windows ===&lt;br /&gt;
On lance &amp;lt;code&amp;gt;PowerShell&amp;lt;/code&amp;gt; et on récupère la clef :&lt;br /&gt;
 &amp;gt; scp &amp;lt;font color = blue&amp;gt;utilisateur&amp;lt;/font&amp;gt;@&amp;lt;font color = blue&amp;gt;IP_DU_SERVEUR&amp;lt;/font&amp;gt;:~/.ssh/hermes_desktop &amp;quot;$env:USERPROFILE\.ssh\hermes_desktop&amp;quot;&lt;br /&gt;
Dans &amp;lt;code&amp;gt;Private Key Path&amp;lt;/code&amp;gt; il faudra alors entrer :&lt;br /&gt;
 C:\Users\&amp;lt;font color=blue&amp;gt;NOM_UTILISATEUR&amp;lt;/font&amp;gt;\.ssh\hermes_desktop&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/nesquena/hermes-webui Hermes WebUI] ==&lt;br /&gt;
Sur le serveur Hermes Agent :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git python3 python3-venv&lt;br /&gt;
 # cd /opt/&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/nesquena/hermes-webui.git&lt;br /&gt;
 # cd hermes-webui&lt;br /&gt;
 # ./ctl.sh start&lt;br /&gt;
On arrête temporairement le serveur :&lt;br /&gt;
 # ./ctl.sh stop&lt;br /&gt;
On crée un service systemd pour qu&#039;il se lance automatiquement :&lt;br /&gt;
 # vi /etc/systemd/system/hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Hermes WebUI&lt;br /&gt;
 Wants=network-online.target&lt;br /&gt;
 After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 Group=root&lt;br /&gt;
 WorkingDirectory=/opt/hermes-webui&lt;br /&gt;
 &lt;br /&gt;
 Environment=HOME=/root&lt;br /&gt;
 Environment=HERMES_HOME=/root/.hermes&lt;br /&gt;
 Environment=HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&lt;br /&gt;
 Environment=HERMES_WEBUI_PORT=&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;&lt;br /&gt;
 EnvironmentFile=-/opt/hermes-webui/.env&lt;br /&gt;
 &lt;br /&gt;
 ExecStart=/bin/bash /opt/hermes-webui/start.sh --foreground&lt;br /&gt;
 &lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 KillSignal=SIGTERM&lt;br /&gt;
 TimeoutStopSec=20&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Par défaut l&#039;interface n&#039;est accessible que depuis le serveur, pour autoriser l&#039;écoute sur une IP remplacer &amp;lt;code&amp;gt;HERMES_WEBUI_HOST=&amp;lt;font color = blue&amp;gt;127.0.0.1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt; par 0.0.0.0 ou une interface IP du serveur.&lt;br /&gt;
&lt;br /&gt;
Ensuite on ajoute un mot de passe :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /opt/hermes-webui/.env&lt;br /&gt;
&lt;br /&gt;
(Recommandé) On peut également conserver &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; et passer par un [[Caddy_ReverseProxy|proxy Caddy]].&lt;br /&gt;
&lt;br /&gt;
On active le service systemd :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un reverse-proxy il faut ajouter :&lt;br /&gt;
 # vi /opt/hermes-webui/.env&lt;br /&gt;
 HERMES_WEBUI_PASSWORD=&amp;lt;font color = blue&amp;gt;MOT_DE_PASSE&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_SECURE=1&lt;br /&gt;
 HERMES_WEBUI_ALLOWED_ORIGINS=&amp;lt;font color = blue&amp;gt;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;hermes.exemple.net&amp;lt;/font&amp;gt;&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_HOST=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_FOR=1&lt;br /&gt;
 HERMES_WEBUI_TRUST_FORWARDED_PROTO=1&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-webui&lt;br /&gt;
&lt;br /&gt;
Exemple de vhost [[Nginx_ReverseProxy_LXC_Alpine_Linux|Nginx]] :&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 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 Host              $proxy_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 https;&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 &amp;lt;nowiki&amp;gt;http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;192.168.1.123&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8787&amp;lt;/font&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
            proxy_ssl_verify off;&lt;br /&gt;
            proxy_ssl_server_name on;&lt;br /&gt;
            proxy_ssl_name 192.168.1.123;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache 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;
=== Mise à jour ===&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes Agent :&lt;br /&gt;
&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
Mettre à jour Hermes WebUI :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/hermes-webui&lt;br /&gt;
 # git pull --ff-only&lt;br /&gt;
 # systemctl restart hermes-webui.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/outsourc-e/hermes-workspace Hermes Workspace] ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
| niveau = information&lt;br /&gt;
| icône = important&lt;br /&gt;
| texte =&lt;br /&gt;
Le projet semble ne plus être maintenu ; il est recommandé d’utiliser [[Hermes#Hermes_WebUI|Hermes WebUI]].&lt;br /&gt;
}}&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. Sinon, utliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
}}&lt;br /&gt;
 # mkdir -p /opt/hermes-workspace/hermes-workspace-data&lt;br /&gt;
 # chown -R 1000:1000 /opt/hermes-workspace/hermes-workspace-data&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;
       TRUST_PROXY: &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;
       - ./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;
{{Méta bandeau&lt;br /&gt;
| niveau = attention&lt;br /&gt;
| icône = attention&lt;br /&gt;
| texte = Si Hermes Workspace est utilisé directement en HTTP sur le réseau local, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=0&amp;lt;/code&amp;gt;. Si Hermes Workspace est publié derrière un reverse proxy HTTPS, utiliser &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;COOKIE_SECURE=1&amp;lt;/code&amp;gt;, le cookie de session n&#039;est transmis que via HTTPS. &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; permet à Hermes Workspace de faire confiance aux informations de protocole et d&#039;adresse transmises par le reverse proxy.&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 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 = /api/terminal-stream {&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_http_version 1.1;&lt;br /&gt;
 &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_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         proxy_buffering off;&lt;br /&gt;
         proxy_cache off;&lt;br /&gt;
 &lt;br /&gt;
         proxy_read_timeout 3600s;&lt;br /&gt;
         proxy_send_timeout 3600s;&lt;br /&gt;
     }&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; et &amp;lt;code&amp;gt;TRUST_PROXY=1&amp;lt;/code&amp;gt; dans le fichier &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; lorsque Hermes Workspace est accessible en HTTPS derrière un proxy.&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-759&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;
==== Réglage voix ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
==== Catalogue des Skills et serveurs MCP dans le conteneur ====&lt;br /&gt;
Pour le moment le plus simple est d&#039;utiliser [https://github.com/LugMuad/hermes-workspace-voice mon fork].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Modification de &amp;lt;code&amp;gt;Dockerfile&amp;lt;/code&amp;gt; pour référence&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Le catalogue des Skills nécessite le script &amp;lt;code&amp;gt;skills-search.py&amp;lt;/code&amp;gt; de Hermes Workspace ainsi que certains modules de Hermes Agent.&lt;br /&gt;
&lt;br /&gt;
Pour les intégrer directement à l&#039;image Docker :&lt;br /&gt;
 # cd /opt/hermes-workspace&lt;br /&gt;
 # vi Dockerfile&lt;br /&gt;
&lt;br /&gt;
Ajouter les éléments suivant en bleu :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \&lt;br /&gt;
       ca-certificates curl tini python3 &amp;lt;font color = blue&amp;gt;python3-httpx python3-yaml&amp;lt;/font&amp;gt; \&lt;br /&gt;
     &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \&lt;br /&gt;
     &amp;amp;&amp;amp; groupadd -r workspace &amp;amp;&amp;amp; useradd -r -g workspace -u 10010 -m workspace&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY scripts/skills-search.py /app/scripts/skills-search.py&lt;br /&gt;
 &lt;br /&gt;
 RUN curl -L \&lt;br /&gt;
       &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;codeload.github.com/NousResearch/hermes-agent/tar.gz/refs/heads/main \&lt;br /&gt;
       -o /tmp/hermes-agent.tar.gz \&lt;br /&gt;
     &amp;amp;&amp;amp; mkdir -p /hermes-agent \&lt;br /&gt;
     &amp;amp;&amp;amp; tar -xzf /tmp/hermes-agent.tar.gz -C /hermes-agent --strip-components=1 \&lt;br /&gt;
     &amp;amp;&amp;amp; rm /tmp/hermes-agent.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 ENV PYTHONPATH=/hermes-agent&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis plus bas :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/dist ./dist&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/node_modules ./node_modules&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/package.json ./package.json&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/server-entry.js ./server-entry.js&lt;br /&gt;
 COPY --from=build --chown=workspace:workspace /app/skills ./skills&lt;br /&gt;
 COPY --chown=workspace:workspace docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;COPY --chown=workspace:workspace assets/mcp-presets.seed.json ./assets/mcp-presets.seed.json&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Reconstruire ensuite l&#039;image et recréer le conteneur :&lt;br /&gt;
 # docker build -t hermes-workspace:fixed .&lt;br /&gt;
 # docker compose up -d --force-recreate&lt;br /&gt;
&lt;br /&gt;
On peut vérifier le fonctionnement avec :&lt;br /&gt;
 # docker exec hermes-workspace python3 -c \&lt;br /&gt;
   &#039;import httpx, yaml, tools.skills_hub; print(&amp;quot;Skills Hub OK&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
Le résultat attendu est :&lt;br /&gt;
 Skills Hub OK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/robbyczgw-cla/hermes-web-search-plus Hermes Web Search Plus] avec [https://github.com/dondai44423/donsetch DonSeTch] ==&lt;br /&gt;
Les opérations se déroulent directement sur l&#039;hôte Hermes.&lt;br /&gt;
&lt;br /&gt;
La configuration présentée ici utilise DonSeTch avec SaerXNG et Firecrawl comme service secondaire afin de rester 100% local, il faut d’abord avoir [[SearXNG|installé une instance SearXNG]] et [[Firecrawl|installé une instance Firecrawl]].&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/robbyczgw-cla/hermes-web-search-plus.git web-search-plus&lt;br /&gt;
&lt;br /&gt;
On choisit le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; afin de ne pas dépendre de services extérieurs ou payants :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py setup --preset self-hosted&lt;br /&gt;
&lt;br /&gt;
Entrer l&#039;adresse de son instance SearXNG :&lt;br /&gt;
 SearXNG key (SEARXNG_INSTANCE_URL, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Il n&#039;est pas obligatoire de renseigner une clé à l&#039;invite suivante :&lt;br /&gt;
 Keenable key (KEENABLE_API_KEY, Enter to skip):&lt;br /&gt;
&lt;br /&gt;
Si le service SearXNG est accessible via une adresse IP privée, il faut l&#039;autoriser explicitement :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 SEARXNG_INSTANCE_URL=&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_PRIVEE_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;PORT&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 SEARXNG_ALLOW_PRIVATE=1&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour configurer Firecrawl, si une clef API est nécessaire il faut la renseigner dans le .env :&lt;br /&gt;
&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_KEY=&amp;lt;font color = blue&amp;gt;FIRECRAWL_API_KEY&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 configurer l&#039;instance Firecrawl, il faut modifier la configuration du plugin :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/plugins/web-search-plus/config.py&lt;br /&gt;
Et remplacer :&lt;br /&gt;
     &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
         &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.firecrawl.dev/v2/search&amp;quot;,&lt;br /&gt;
         &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
         &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
         &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
     },&lt;br /&gt;
Par (exemple avec http simple) :&lt;br /&gt;
    &amp;quot;firecrawl&amp;quot;: {&lt;br /&gt;
        &amp;quot;api_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&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;/v2/search&amp;quot;,&lt;br /&gt;
        &amp;quot;scrape_url&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;IP_FIRECRAW&amp;lt;/font&amp;gt;L:&amp;lt;font color = green&amp;gt;3002&amp;lt;/font&amp;gt;/v2/scrape&amp;quot;,&lt;br /&gt;
        &amp;quot;timeout&amp;quot;: 30000,&lt;br /&gt;
        &amp;quot;sources&amp;quot;: [&amp;quot;web&amp;quot;],&lt;br /&gt;
        &amp;quot;ignore_invalid_urls&amp;quot;: False&lt;br /&gt;
    },&lt;br /&gt;
L&#039;option suivante n&#039;est nécessaire que si &amp;lt;code&amp;gt;web_extract_plus&amp;lt;/code&amp;gt; doit être autorisé à extraire des pages situées sur un réseau privé ou un intranet :&lt;br /&gt;
     &amp;quot;extract&amp;quot;: { &lt;br /&gt;
         # Target URLs supplied to extract_plus are blocked when they resolve to&lt;br /&gt;
         # private/internal networks. Operators can opt in for trusted intranet use.&lt;br /&gt;
         &amp;quot;allow_private_urls&amp;quot;: &amp;lt;font color = blue&amp;gt;True&amp;lt;/font&amp;gt;,&lt;br /&gt;
     },&lt;br /&gt;
&lt;br /&gt;
On teste ensuite le fonctionnement du plugin :&lt;br /&gt;
 # cd ~/.hermes/plugins/web-search-plus&lt;br /&gt;
 # python3 search.py --query &amp;quot;Hermes Agent latest release&amp;quot; --provider auto --quality-report&lt;br /&gt;
&lt;br /&gt;
* On installe DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch&lt;br /&gt;
&lt;br /&gt;
On installe Chromium :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install chromium&lt;br /&gt;
&lt;br /&gt;
On vérifie son fonctionnement :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
On ajoute le chemin du binaire DonSeTch à l&#039;environnement d&#039;Hermes :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
 DONSETCH_BIN=/root/.hermes/node/bin/donsetch&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le preset &amp;lt;code&amp;gt;self-hosted&amp;lt;/code&amp;gt; limite par défaut le routage automatique à SearXNG et Keenable. On réinitialise donc la configuration afin de repasser sur le profil &amp;lt;code&amp;gt;standard&amp;lt;/code&amp;gt;, puis on autorise Web Search Plus à utiliser DonSeTch en priorité pour la recherche et Firecrawl pour l&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config reset --yes&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-routing on&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On désactive les autres fournisseurs :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable brave&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable exa&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable linkup&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable octen&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable parallel&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable querit&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serpbase&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable serper&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tavily&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable tinyfish&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config disable you&lt;br /&gt;
&lt;br /&gt;
On réapplique les priorités de recherche et d&#039;extraction :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-priority donsetch,searxng&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-extract-priority donsetch,firecrawl&lt;br /&gt;
&lt;br /&gt;
On définit Keenable comme fournisseur de secours. Il s&#039;agit d&#039;un fournisseur extérieur disposant d&#039;un accès gratuit limité sans clé API :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-fallback keenable&lt;br /&gt;
&lt;br /&gt;
On autorise l&#039;utilisation automatique de DonSeTch :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config set-auto-allow donsetch on&lt;br /&gt;
&lt;br /&gt;
Pour vérifier la configuration :&lt;br /&gt;
 # python3 ~/.hermes/plugins/web-search-plus/setup.py config show --json&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour remplacer les outils web natifs (non recommandée et partiellement fonctionnelle)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* (Optionnel) On désactive les outils web natifs de Hermes pour utiliser uniquement ceux du plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Et on ajoute dans la section &amp;lt;code&amp;gt;agent:&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;web&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Provider Web pour les outils natifs Hermes ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ancienne méthode pour référence, aujourd&#039;hui intégrée nativement au plugin depuis la version 4.1.0&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Cette configuration permet de conserver les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes tout en remplaçant leur backend par Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Le modèle continue donc d&#039;utiliser les outils Web habituels de Hermes, mais les recherches et extractions sont transmises de manière transparente à Web Search Plus, qui applique ensuite sa propre configuration de routage vers DonSeTch, SearXNG, Firecrawl ou les autres providers activés.&lt;br /&gt;
&lt;br /&gt;
* Réactiver &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; dans la configuration d&#039;Hermes si nécessaire (supprimer &amp;lt;code&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;) :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
 ...&lt;br /&gt;
 disabled_toolsets: [&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;web&amp;lt;/font&amp;gt;&amp;lt;font color = grey&amp;gt;]&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Création d&#039;un provider Web pour remplacer de façon transparente les backends utilisés par les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes :&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/web/wsp&lt;br /&gt;
&lt;br /&gt;
On crée le fichier de métadonnées du plugin :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/plugin.yaml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 name: web-wsp&lt;br /&gt;
 version: 1.0.0&lt;br /&gt;
 description: &amp;quot;Web Search Plus backend for Hermes native web_search/web_extract tools.&amp;quot;&lt;br /&gt;
 author: local&lt;br /&gt;
 kind: backend&lt;br /&gt;
 provides_web_providers:&lt;br /&gt;
   - wsp&lt;br /&gt;
&lt;br /&gt;
On crée ensuite le provider Web. Celui-ci sert d&#039;adaptateur entre les outils natifs de Hermes et Web Search Plus :&lt;br /&gt;
 # vi ~/.hermes/plugins/web/wsp/__init__.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
import json&lt;br /&gt;
import subprocess&lt;br /&gt;
import sys&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
from typing import Any, Dict, List&lt;br /&gt;
&lt;br /&gt;
from agent.web_search_provider import WebSearchProvider&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WSP_DIR = Path.home() / &amp;quot;.hermes&amp;quot; / &amp;quot;plugins&amp;quot; / &amp;quot;web-search-plus&amp;quot;&lt;br /&gt;
WSP_SEARCH = WSP_DIR / &amp;quot;search.py&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class WSPWebSearchProvider(WebSearchProvider):&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;wsp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def display_name(self) -&amp;gt; str:&lt;br /&gt;
        return &amp;quot;Web Search Plus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def is_available(self) -&amp;gt; bool:&lt;br /&gt;
        return WSP_SEARCH.exists()&lt;br /&gt;
&lt;br /&gt;
    def supports_search(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def supports_extract(self) -&amp;gt; bool:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def search(self, query: str, limit: int = 5) -&amp;gt; Dict[str, Any]:&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--query&amp;quot;,&lt;br /&gt;
            query,&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--max-results&amp;quot;,&lt;br /&gt;
            str(limit),&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus search failed: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: proc.stderr.strip() or &amp;quot;Web Search Plus search failed&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return {&lt;br /&gt;
                &amp;quot;success&amp;quot;: False,&lt;br /&gt;
                &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for i, item in enumerate(data.get(&amp;quot;results&amp;quot;, [])[:limit], start=1):&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;description&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;snippet&amp;quot;)&lt;br /&gt;
                        or item.get(&amp;quot;description&amp;quot;)&lt;br /&gt;
                        or &amp;quot;&amp;quot;&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;position&amp;quot;: i,&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return {&lt;br /&gt;
            &amp;quot;success&amp;quot;: True,&lt;br /&gt;
            &amp;quot;data&amp;quot;: {&lt;br /&gt;
                &amp;quot;web&amp;quot;: results,&lt;br /&gt;
            },&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    def extract(&lt;br /&gt;
        self,&lt;br /&gt;
        urls: List[str],&lt;br /&gt;
        format: str = &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        **kwargs: Any,&lt;br /&gt;
    ) -&amp;gt; List[Dict[str, Any]]:&lt;br /&gt;
&lt;br /&gt;
        cmd = [&lt;br /&gt;
            sys.executable,&lt;br /&gt;
            str(WSP_SEARCH),&lt;br /&gt;
            &amp;quot;--provider&amp;quot;,&lt;br /&gt;
            &amp;quot;auto&amp;quot;,&lt;br /&gt;
            &amp;quot;--extract-urls&amp;quot;,&lt;br /&gt;
            *urls,&lt;br /&gt;
            &amp;quot;--format&amp;quot;,&lt;br /&gt;
            format or &amp;quot;markdown&amp;quot;,&lt;br /&gt;
        ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            proc = subprocess.run(&lt;br /&gt;
                cmd,&lt;br /&gt;
                cwd=str(WSP_DIR),&lt;br /&gt;
                capture_output=True,&lt;br /&gt;
                text=True,&lt;br /&gt;
                timeout=90,&lt;br /&gt;
                check=False,&lt;br /&gt;
            )&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Web Search Plus extraction failed: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if proc.returncode != 0:&lt;br /&gt;
            error = (&lt;br /&gt;
                proc.stderr.strip()&lt;br /&gt;
                or &amp;quot;Web Search Plus extraction failed&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: error,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            data = json.loads(proc.stdout)&lt;br /&gt;
        except Exception as exc:&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: f&amp;quot;Invalid Web Search Plus JSON: {exc}&amp;quot;,&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        if data.get(&amp;quot;error&amp;quot;) and not data.get(&amp;quot;results&amp;quot;):&lt;br /&gt;
            return [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: url,&lt;br /&gt;
                    &amp;quot;title&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;content&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                    &amp;quot;error&amp;quot;: str(data[&amp;quot;error&amp;quot;]),&lt;br /&gt;
                }&lt;br /&gt;
                for url in urls&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        results = []&lt;br /&gt;
&lt;br /&gt;
        for item in data.get(&amp;quot;results&amp;quot;, []):&lt;br /&gt;
            if not isinstance(item, dict):&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            content = str(&lt;br /&gt;
                item.get(&amp;quot;content&amp;quot;)&lt;br /&gt;
                or item.get(&amp;quot;markdown&amp;quot;)&lt;br /&gt;
                or &amp;quot;&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            results.append(&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;url&amp;quot;: str(item.get(&amp;quot;url&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;title&amp;quot;: str(item.get(&amp;quot;title&amp;quot;, &amp;quot;&amp;quot;)),&lt;br /&gt;
                    &amp;quot;content&amp;quot;: content,&lt;br /&gt;
                    &amp;quot;raw_content&amp;quot;: str(&lt;br /&gt;
                        item.get(&amp;quot;raw_content&amp;quot;)&lt;br /&gt;
                        or content&lt;br /&gt;
                    ),&lt;br /&gt;
                    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                        &amp;quot;provider&amp;quot;: data.get(&amp;quot;provider&amp;quot;),&lt;br /&gt;
                        &amp;quot;fetcher&amp;quot;: item.get(&amp;quot;fetcher&amp;quot;),&lt;br /&gt;
                        &amp;quot;status&amp;quot;: item.get(&amp;quot;status&amp;quot;),&lt;br /&gt;
                        &amp;quot;quality&amp;quot;: item.get(&amp;quot;quality&amp;quot;),&lt;br /&gt;
                        &amp;quot;lang&amp;quot;: item.get(&amp;quot;lang&amp;quot;),&lt;br /&gt;
                        &amp;quot;source_type&amp;quot;: item.get(&amp;quot;source_type&amp;quot;),&lt;br /&gt;
                        &amp;quot;page_type&amp;quot;: item.get(&amp;quot;page_type&amp;quot;),&lt;br /&gt;
                    },&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
        return results&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def register(ctx) -&amp;gt; None:&lt;br /&gt;
    ctx.register_web_search_provider(WSPWebSearchProvider())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le provider lance Web Search Plus dans un sous-processus distinct pour les recherches comme pour les extractions. Cela évite notamment les conflits entre les modules Python de Hermes et ceux de Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
On active ensuite le plugin :&lt;br /&gt;
 # hermes plugins enable web-wsp&lt;br /&gt;
&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; à la demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
&lt;br /&gt;
Cette autorisation est nécessaire car le plugin fournit un backend susceptible d&#039;intercepter les appels effectués par les outils Web natifs de Hermes.&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&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;
&amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt; définit le backend Web général, tandis que &amp;lt;code&amp;gt;search_backend&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;extract_backend&amp;lt;/code&amp;gt; permettent de sélectionner explicitement des backends différents pour la recherche et l&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
Avec cette configuration, les outils natifs &amp;lt;code&amp;gt;web_search&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;web_extract&amp;lt;/code&amp;gt; de Hermes restent inchangés pour le modèle, mais leurs appels sont transmis de façon transparente à Web Search Plus.&lt;br /&gt;
&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On édite la configuration de Hermes pour utiliser le nouveau provider :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 web:&lt;br /&gt;
   backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   search_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
   extract_backend: &amp;lt;font color = blue&amp;gt;wsp&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
* Hermes Web Search Plus&lt;br /&gt;
 # hermes plugins update web-search-plus&lt;br /&gt;
Le scanner de sécurité de Hermes peut désactiver le plugin après la mise à jour si celui-ci obtient un verdict &amp;lt;code&amp;gt;dangerous&amp;lt;/code&amp;gt;. Si le plugin est de nouveau désactivé, le réactiver manuellement :&lt;br /&gt;
 # hermes plugins enable web-search-plus&lt;br /&gt;
Répondre &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; si demande d&#039;autorisation :&lt;br /&gt;
 This is a privileged capability: an override can intercept everything the agent routes&lt;br /&gt;
 through that tool.&lt;br /&gt;
 Grant it?&lt;br /&gt;
Puis redémarrer Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* DonSeTch :&lt;br /&gt;
 # npm install -g --allow-scripts=donsetch,@google/genai,protobufjs donsetch@latest&lt;br /&gt;
On vérifie ensuite la version et le bon fonctionnement de DonSeTch :&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch --version&lt;br /&gt;
 # /root/.hermes/node/bin/donsetch doctor&lt;br /&gt;
&lt;br /&gt;
==[https://github.com/mnemosyne-oss/mnemosyne Mnemosyne]==&lt;br /&gt;
&lt;br /&gt;
Mnemosyne est une couche de mémoire universelle, conçue en priorité pour Hermes, mais compatible avec n’importe quel framework d’agents.&lt;br /&gt;
&lt;br /&gt;
* On installe le plugin :&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m ensurepip --upgrade&lt;br /&gt;
 # python -m pip install --upgrade pip&lt;br /&gt;
 # python -m pip install mnemosyne-hermes&lt;br /&gt;
 # mkdir -p ~/.hermes/plugins/mnemosyne&lt;br /&gt;
 # ln -sfn &amp;quot;$(~/.hermes/hermes-agent/venv/bin/python -c &#039;import pathlib, mnemosyne_hermes; print(pathlib.Path(mnemosyne_hermes.__file__).resolve().parent)&#039;)&amp;quot;/* ~/.hermes/plugins/mnemosyne/&lt;br /&gt;
 # hermes config set memory.provider mnemosyne&lt;br /&gt;
&lt;br /&gt;
On édite ensuite la configuration de Hermes :&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 memory:&lt;br /&gt;
   memory_enabled: &amp;lt;font color = blue&amp;gt;false&amp;lt;/font&amp;gt;&lt;br /&gt;
   user_profile_enabled: &amp;lt;font color = blue&amp;gt;false&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;
Ces deux options désactivent la mémoire native de Hermes (&amp;lt;code&amp;gt;MEMORY.md&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;USER.md&amp;lt;/code&amp;gt;) afin d&#039;utiliser Mnemosyne comme fournisseur de mémoire.&lt;br /&gt;
&lt;br /&gt;
=== Embedding ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne-Hermes est livré avec le support des embeddings locaux. Un modèle d&#039;embedding est nécessaire au fonctionnement de la mémoire vectorielle ; il peut être exécuté localement ou fourni par un serveur externe.&lt;br /&gt;
&lt;br /&gt;
==== Modèle local ====&lt;br /&gt;
&lt;br /&gt;
Le modèle utilisé par défaut, &amp;lt;code&amp;gt;BAAI/bge-small-en-v1.5&amp;lt;/code&amp;gt;, est principalement destiné à l&#039;anglais. Pour un usage multilingue, on peut par exemple utiliser le modèle léger &amp;lt;code&amp;gt;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_model sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2&lt;br /&gt;
 # mnemosyne config set embedding_dim 384&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api false&lt;br /&gt;
&lt;br /&gt;
Le modèle local est téléchargé automatiquement lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Voir la [https://github.com/mnemosyne-oss/mnemosyne/blob/main/docs/configuration.md#custom-embedding-models liste des modèles d&#039;embedding disponibles].&lt;br /&gt;
&lt;br /&gt;
==== Serveur d&#039;embedding externe ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser un serveur d&#039;embedding compatible avec l&#039;API OpenAI :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set embedding_api_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set embedding_dim &amp;lt;font color = blue&amp;gt;DIMENSION_DU_MODELE&amp;lt;/font&amp;gt;&lt;br /&gt;
 # mnemosyne config set embeddings_via_api true&lt;br /&gt;
&lt;br /&gt;
La valeur de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt; doit impérativement correspondre à la dimension produite par le modèle d&#039;embedding utilisé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; changer de modèle d&#039;embedding ou de dimension sur une base Mnemosyne contenant déjà des données peut nécessiter une reconstruction des embeddings existants.&lt;br /&gt;
==== Changer de modèle d&#039;embedding ou de dimension ====&lt;br /&gt;
&lt;br /&gt;
Pour changer de modèle d&#039;embedding en toute sécurité, il faut d&#039;abord enregistrer le nouveau modèle et, si nécessaire, sa dimension dans la configuration utilisée par Hermes après redémarrage.&lt;br /&gt;
&lt;br /&gt;
On arrête ensuite Hermes ainsi que tout autre processus susceptible d&#039;écrire dans la même base SQLite :&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
On vérifie alors le plan de réindexation sans modifier la base :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --dry-run&lt;br /&gt;
&lt;br /&gt;
La commande doit afficher le modèle et la dimension attendus. Il ne faut pas poursuivre si ces valeurs ne correspondent pas à la configuration qui sera utilisée après le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Une fois le résultat vérifié, on lance la réindexation :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne reindex --model &amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt; --yes&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne crée une sauvegarde, recalcule les embeddings des mémoires de travail et épisodiques et, lorsque &amp;lt;code&amp;gt;sqlite-vec&amp;lt;/code&amp;gt; est disponible, reconstruit les tables vectorielles avec la dimension définie par la configuration effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention :&#039;&#039;&#039; l&#039;option &amp;lt;code&amp;gt;--model&amp;lt;/code&amp;gt; ne remplace pas une valeur explicite de &amp;lt;code&amp;gt;embedding_dim&amp;lt;/code&amp;gt;. Si une dimension est configurée, elle doit correspondre à la dimension réellement produite par le nouveau modèle.&lt;br /&gt;
&lt;br /&gt;
On redémarre ensuite Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
=== LLM optionnel ===&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut utiliser un LLM en complément du modèle d&#039;embedding.&lt;br /&gt;
&lt;br /&gt;
Ce LLM n&#039;est pas nécessaire au fonctionnement de base de la mémoire. Lorsqu&#039;il est activé, il est notamment utilisé pour :&lt;br /&gt;
* la consolidation et la synthèse des souvenirs lors des opérations de &amp;lt;code&amp;gt;sleep&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l&#039;extraction structurée de faits ;&lt;br /&gt;
* certaines opérations avancées basées sur un LLM.&lt;br /&gt;
&lt;br /&gt;
En l&#039;absence de LLM disponible, Mnemosyne peut continuer à fonctionner en utilisant ses mécanismes de traitement non-LLM.&lt;br /&gt;
&lt;br /&gt;
==== Aucun LLM ====&lt;br /&gt;
&lt;br /&gt;
Par défaut dans la configuration déclarée de Mnemosyne, le LLM est désactivé.&lt;br /&gt;
&lt;br /&gt;
Pour forcer explicitement ce fonctionnement :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled false&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mnemosyne fonctionne alors sans LLM pour les opérations de consolidation et d&#039;extraction.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le LLM local ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne possède une configuration par défaut pour un petit LLM local GGUF utilisé pour les opérations de consolidation, de synthèse et d&#039;extraction de faits.&lt;br /&gt;
&lt;br /&gt;
Le backend local n&#039;est toutefois disponible que si ses dépendances optionnelles sont installées :&lt;br /&gt;
&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install -U &#039;mnemosyne-memory[all]&#039;&lt;br /&gt;
&lt;br /&gt;
On active ensuite le support LLM de Mnemosyne et on désactive l&#039;utilisation du LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Pour forcer l&#039;utilisation du modèle local plutôt qu&#039;un éventuel serveur LLM distant :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set force_local true&lt;br /&gt;
&lt;br /&gt;
Par défaut, Mnemosyne utilise :&lt;br /&gt;
&lt;br /&gt;
 * Dépôt : &amp;lt;code&amp;gt;openbmb/MiniCPM5-1B-GGUF&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Modèle : &amp;lt;code&amp;gt;MiniCPM5-1B-Q4_K_M.gguf&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Contexte : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Sortie maximale : &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; tokens&lt;br /&gt;
 * Threads CPU : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
 * Cache : &amp;lt;code&amp;gt;~/.hermes/mnemosyne/models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut enregistrer explicitement ces valeurs dans la configuration :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_repo &amp;quot;openbmb/MiniCPM5-1B-GGUF&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_file &amp;quot;MiniCPM5-1B-Q4_K_M.gguf&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_n_ctx 2048&lt;br /&gt;
 # mnemosyne config set llm_max_tokens 2048&lt;br /&gt;
 # mnemosyne config set llm_n_threads 4&lt;br /&gt;
 # mnemosyne config set model_cache_dir &amp;quot;~/.hermes/mnemosyne/models&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le modèle GGUF est téléchargé dans le cache lors de sa première utilisation.&lt;br /&gt;
&lt;br /&gt;
Les valeurs par défaut correspondantes sont :&lt;br /&gt;
&lt;br /&gt;
 MNEMOSYNE_LLM_ENABLED=true&lt;br /&gt;
 MNEMOSYNE_LLM_N_CTX=2048&lt;br /&gt;
 MNEMOSYNE_LLM_MAX_TOKENS=2048&lt;br /&gt;
 MNEMOSYNE_LLM_N_THREADS=4&lt;br /&gt;
 MNEMOSYNE_LLM_REPO=openbmb/MiniCPM5-1B-GGUF&lt;br /&gt;
 MNEMOSYNE_LLM_FILE=MiniCPM5-1B-Q4_K_M.gguf&lt;br /&gt;
 MNEMOSYNE_MODEL_CACHE_DIR=~/.hermes/mnemosyne/models&lt;br /&gt;
&lt;br /&gt;
==== Utiliser le modèle auxiliaire de Hermes ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut déléguer ses opérations LLM au client auxiliaire de Hermes.&lt;br /&gt;
&lt;br /&gt;
On active d&#039;abord les opérations LLM de Mnemosyne ainsi que le backend fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set host_llm_enabled true&lt;br /&gt;
&lt;br /&gt;
Pour utiliser directement la configuration auxiliaire de Hermes, on laisse les éventuelles surcharges Mnemosyne vides :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_provider &amp;quot;&amp;quot;&lt;br /&gt;
 # mnemosyne config set host_llm_model &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le LLM auxiliaire de Hermes, le backend hôte doit également être activé dans l&#039;environnement du service Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_HOST_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;MNEMOSYNE_LLM_ENABLED=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Mnemosyne utilise alors la configuration &amp;lt;code&amp;gt;auxiliary.compression&amp;lt;/code&amp;gt; de Hermes. Si aucun modèle auxiliaire particulier n&#039;est configuré dans Hermes, la configuration par défaut fait utiliser à Hermes son modèle principal pour cette tâche.&lt;br /&gt;
&lt;br /&gt;
==== Utiliser un LLM via une API ====&lt;br /&gt;
&lt;br /&gt;
Mnemosyne peut également utiliser directement un serveur compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
On désactive dans ce cas le backend LLM fourni par Hermes :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set host_llm_enabled false&lt;br /&gt;
&lt;br /&gt;
Puis on active le LLM et on configure l&#039;API :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_enabled true&lt;br /&gt;
 # mnemosyne config set llm_base_url &amp;quot;http://&amp;lt;font color = blue&amp;gt;ADRESSE_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = blue&amp;gt;PORT&amp;lt;/font&amp;gt;/v1&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;lt;font color = blue&amp;gt;CLEF_API&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # mnemosyne config set llm_model &amp;quot;&amp;lt;font color = blue&amp;gt;NOM_EXACT_DU_MODELE&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette API peut être fournie par exemple par llama.cpp, vLLM, Ollama, LM Studio ou tout autre serveur proposant une interface compatible avec l&#039;API OpenAI.&lt;br /&gt;
&lt;br /&gt;
Si le serveur n&#039;exige pas de clé API, &amp;lt;code&amp;gt;llm_api_key&amp;lt;/code&amp;gt; peut rester vide :&lt;br /&gt;
&lt;br /&gt;
 # mnemosyne config set llm_api_key &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Fin de la configuration ===&lt;br /&gt;
Après modification de la configuration, on redémarre Hermes :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # source ~/.hermes/hermes-agent/venv/bin/activate&lt;br /&gt;
 # python -m pip install --upgrade mnemosyne-hermes&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== [https://github.com/stephenschoettler/hermes-lcm Hermes-LCM] ==&lt;br /&gt;
Hermes-LCM est un plugin de gestion de contexte « lossless » pour Hermes Agent. Lorsqu’il est utilisé comme moteur de contexte, il remplace la compression ponctuelle du contexte actif par un système persistant basé sur SQLite et une structure hiérarchique en DAG.&lt;br /&gt;
&lt;br /&gt;
On installe les fichiers du projet :&lt;br /&gt;
 # git clone https://github.com/stephenschoettler/hermes-lcm \&lt;br /&gt;
   ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
Puis on exécute le script d&#039;installation afin d&#039;exposer également le skill Hermes-LCM :&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm&lt;br /&gt;
 # ./scripts/install.sh&lt;br /&gt;
On active la configuration de Hermes pour activer le plugin :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
Dans la sction &amp;lt;code&amp;gt;plugins:&amp;lt;/code&amp;gt; ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 plugins:&amp;lt;/font&amp;gt;&lt;br /&gt;
   enabled:&lt;br /&gt;
     - hermes-lcm&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis rempalcer :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: compressor&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Par :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 context:&lt;br /&gt;
   engine: &amp;lt;font color = blue&amp;gt;lcm&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre Hermes :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
=== Mise à jour ===&lt;br /&gt;
 # cd ~/.hermes/plugins/hermes-lcm &amp;amp;&amp;amp; git pull --ff-only&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>
</feed>