Quels plugins installer pour DeepSeek Harness ?
Découvrez cinq plugins DeepSeek Harness pour un VPS : plafonnement des dépenses, permissions d’outils, détection d’injections, mémoire persistante et accès LAN.
Quels plugins DeepSeek Harness valent la peine d’être installés
Les plugins DeepSeek Harness sont du code tiers qui s’exécute dans votre agent, avec les privilèges de celui-ci, sur une machine que vous payez. La liste communautaire couvre plus de vingt catégories et plus de mille entrées. Sur un serveur privé virtuel (VPS) loué, vous en avez besoin de cinq : dsh-budget pour plafonner les dépenses, dsh-permission-rules pour contrôler l’accès aux outils, dsh-defend pour détecter les injections et les secrets, dsh-memory pour les faits qui persistent au-delà d’une session, et dsh-web-lan-access seulement après avoir défini votre méthode d’authentification.
Le harness est dsh, le harness d’agent open source de DeepSeek, conçu pour que tout soit un plugin. Son propre README le présente comme une version de prévisualisation destinée aux développeurs et contient l’avertissement THERE WILL BE COMPATIBILITY-BREAKING CHANGES. Ce seul fait détermine tous les choix ci-dessous. Épinglez les versions des éléments installés, prévoyez qu’une mise à niveau puisse les rendre incompatibles et gardez un ensemble assez réduit pour pouvoir en lire l’intégralité. Si le harness ne s’exécute pas encore, commencez par installer DeepSeek Harness sur un VPS, puis revenez ici. Si les éléments auxquels ces plugins se raccordent — la boucle de l’agent, ses outils et sa mémoire — restent flous, commencez par revoir les fondamentaux, car il est plus facile d’évaluer chaque choix une fois que vous savez ce que fait chaque couche.
Comment dsh installe un plugin et où se trouve la configuration
dsh se construit à partir de plugins Cordis. Une instance en cours d’exécution est donc un arbre de plugins, et non un programme unique. Un profil est une composition nommée de ces plugins. Les deux templates sont web et headless. $DSH_HOME utilise ~/.dsh par défaut. Un profil se trouve dans $DSH_HOME/profiles/<name>/. Il contient son propre package.json, un manifeste dsh.profile et un cordis.patch.yml.
dsh plugin --profile web list
dsh plugin --profile web add dsh-budget
dsh plugin --profile web remove dsh-budgetQuatre formes de source sont prises en charge : le nom nu d’un package npm, un nom scoped comme @towzai/dsh-memory, une référence GitHub comme github:PerryLink/dsh-budget#main, et un chemin local avec link: ou ./. Privilégiez la forme GitHub, car vous pouvez remplacer #main par un commit et récupérer exactement le même code le mois prochain.
dsh plugin --profile web add "github:PerryLink/dsh-budget#461d478"Les layers sont appliquées dans un ordre fixe : chaque bundle dans l’ordre indiqué par le profil, puis le cordis.patch.yml du profil, puis le cordis.patch.yml au niveau du home, puis tout overlay --patch. L’ordre est important, car une layer ultérieure peut reconfigurer ou supprimer ce qu’une layer précédente a configuré. Ainsi, lorsqu’un plugin semble installé mais ne fait rien, ouvrez le cordis.patch.yml du profil et vérifiez deux éléments : son bloc d’insertion est présent et aucune layer ultérieure ne le désactive.
Au 17 août 2026, le package npm @deepseek-ai/dsh est en version 0.1.0-rc.7, tandis que chaque plugin ci-dessous déclare être compatible avec 0.1.0-rc.5 à 0.1.0-rc.6. Cet écart est normal dans cet écosystème. C’est aussi la raison habituelle pour laquelle un plugin cesse de se charger : le harness évolue plus vite que les plugins qui l’entourent. Mettez volontairement le harness à niveau, puis testez les plugins un par un.
Lisez le code d’un plugin avant de lui faire confiance
Un plugin dsh n’est pas isolé du harness. Il est chargé dans le même arbre Cordis et dans le même processus, avec le même utilisateur du système d’exploitation, les mêmes identifiants de modèle et le même répertoire de travail. En installer un revient davantage à exécuter le script de quelqu’un d’autre avec sudo qu’à ajouter une extension de navigateur. C’est la même question de confiance que celle soulevée par les plugins Claude Code, et la réponse est la même : lisez le code ou ne l’installez pas.
Voici quatre points à vérifier, dans cet ordre :
- Les points d’extension utilisés.
tools/pre-executesignifie que le plugin voit chaque appel d’outil et peut le bloquer.agent/pre-stepsignifie qu’il voit vos messages.webServer.tapIndexsignifie qu’il réécrit la page servie à votre navigateur. Un plugin qui n’utilise aucun de ces points peut faire très peu de choses ; un plugin qui les utilise tous constitue votre frontière de sécurité. - La présence de communications réseau. Recherchez
fetch,httpet tout hostname codé en dur dans le code source. Un compteur de coûts qui envoie des données à son éditeur transmet votre profil d’utilisation à un tiers. - L’accès aux identifiants. Tout ce qui accède à
credentials.*ou à une clé de fournisseur doit avoir une raison clairement indiquée dans le README. - La licence et la date du dernier commit. Un plugin sans licence, qui n’a pas été modifié depuis des mois dans un écosystème qui évolue chaque semaine, constitue un risque.
Installez ensuite le plugin à partir d’un commit plutôt que d’une branche, puis lisez le bloc d’insertion que l’installateur a écrit dans cordis.patch.yml. Ce bloc indique l’identifiant du plugin et la configuration qu’il a enregistrée. C’est la description la plus concise et la plus fiable de ce que vous venez d’ajouter. Lorsque le harness le permet, gardez les clés de fournisseur hors de portée du plugin, comme indiqué dans la conservation des secrets hors des agents IA.
dsh-budget : comment empêcher un agent de dépenser toute la nuit ?
Un agent s’exécute sans surveillance sur un VPS. C’est précisément l’intérêt de l’y installer, mais c’est aussi le risque. dsh-budget comptabilise les tokens et le coût estimé par modèle, par session et par jour, puis applique des plafonds à ces totaux.
dsh plugin --profile web add "github:PerryLink/dsh-budget#461d478"Les valeurs par défaut sont généreuses : 10 USD par session, 50 par jour et 500 par mois. Elles conviennent à une équipe financée. Sur un serveur personnel, elles sont suffisamment élevées pour qu’une boucle incontrôlée se termine avant que le plafond ne s’applique. Réduisez-les dès le premier jour.
The data behind this chart
[
{
"label": "Per session",
"plugin_default_usd": 10,
"suggested_start_usd": 2
},
{
"label": "Per day",
"plugin_default_usd": 50,
"suggested_start_usd": 5
},
{
"label": "Per month",
"plugin_default_usd": 500,
"suggested_start_usd": 40
}
]La valeur suggérée est un point de départ pour un opérateur sur une machine, pas une valeur publiée. Augmentez-la lorsqu’un mois d’utilisation réelle le justifie. Un plafond mensuel de 40 USD avec un plafond de session de 2 échoue rapidement et de manière visible. C’est ce que vous voulez tant que vous évaluez l’appétit de l’outil.
- id: budget
config:
budgets:
session: 2
daily: 5
monthly: 40
warnRatio: 0.8
overLimit: blockLe paramètre qui modifie le comportement de la machine est overLimit. Sa valeur par défaut est alert. Elle affiche un avertissement, mais continue les dépenses. Par défaut, ce plugin sert donc de tableau de bord. Définissez-le sur block : le harness refuse alors les appels supplémentaires aux modèles dès qu’un plafond est atteint. Un job lancé pendant la nuit s’arrête ainsi au lieu de continuer à facturer jusqu’au matin. degrade est le troisième mode. Il remplace le modèle par un modèle moins cher défini dans la map degradation. Ce mode convient lorsqu’un job doit aller à son terme, mais n’a pas besoin de votre meilleur modèle. warnRatio vaut par défaut 0.8. Vous êtes donc averti lorsque 80 pour cent du plafond est atteint.
Deux limites doivent être connues. Le coût est calculé à partir des tarifs que vous fournissez : prices est vide par défaut et defaultPrice utilise par défaut 1.0 USD par million de tokens d’entrée et 3.0 par million de tokens de sortie. Renseignez les valeurs réelles de vos modèles. Sinon, le tableau de bord n’est qu’une estimation présentée comme une mesure. Ensuite, le plugin agrège les données dans le processus en cours à partir du flux d’événements de la session. Les totaux sont donc réinitialisés lorsque le harness redémarre. Une boucle de crash, ou un supervisor qui redémarre dsh, réinitialise un plafond quotidien. Considérez dsh-budget comme une barrière de protection contre vos propres jobs et définissez une limite de dépenses sur le compte du fournisseur comme plafond réel. C’est l’argument général présenté dans contrôler le coût d’un agent IA sur un VPS.
Au quotidien, utilisez /budget pour la vue d’ensemble, /budget models pour le détail par modèle et /budget unblock <scope> pour lever un blocage après avoir décidé de poursuivre.
Règles de permission de dsh : quels appels d’outils ne doivent jamais être exécutés ?
dsh-permission-rules place des règles déclaratives dans le flux tools/pre-execute. Une règle est donc évaluée avant l’exécution d’un outil. Trois actions sont disponibles. allow laisse passer l’appel, deny le bloque et renvoie une raison que le modèle peut lire, tandis que ask l’achemine vers le mécanisme officiel d’approbation.
dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#b30b4fb"Les règles se trouvent dans .dsh/rules.yaml, relatif au répertoire de travail de la session. Un fallbackPath global et un searchUp facultatif permettent de remonter vers la racine du système de fichiers. La correspondance couvre les jokers du nom de l’outil, les jokers des clés et valeurs de paramètres, les jokers de chemins relatifs à l’espace de travail, les sélecteurs d’agents tels que main ou subagent, ainsi que les cibles réseau.
rules:
- match: { tools: [bash], params: { command: "rm -rf*" } }
action: deny
reason: "No recursive deletes"
- match: { tools: [edit, write], paths: ["**/.env*", "**/secrets/**"] }
action: ask
reason: "Secret files need confirmation"
- match: { tools: ["mcp__*"] }
action: ask
reason: "MCP tools need confirmation"L’évaluation s’arrête à la première correspondance. Ainsi, un allow général placé vers le début annule silencieusement toutes les règles plus précises qui le suivent. Écrivez d’abord les refus, puis les règles permissives. Le joker du nom de l’outil couvre mcp__*. C’est ainsi que vous contrôlez les outils fournis par un serveur de protocole de contexte de modèle (MCP), plutôt que par le harness lui-même. Cela devient important dès que vous exécutez des serveurs MCP sur un VPS.
Un comportement doit être anticipé : ask nécessite une personne pour répondre. Avec un profil headless, personne ne surveille forcément la session. Une règle ask peut donc suspendre une exécution jusqu’à l’arrivée de quelqu’un. Utilisez deny pour tout ce que vous n’approuveriez jamais. Réservez ask au profil que vous surveillez directement. Pour que les approbations fonctionnent sans surveillance, il faut un véritable canal de réponse. C’est le sujet de la restriction des actions d’un agent IA au moyen d’approbations.
dsh-defend : qu’en est-il de l’injection de prompt et des secrets divulgués ?
dsh-defend effectue des scans à trois étapes : les messages entrants sur agent/pre-step, les arguments des outils sur tools/pre-execute, avec une protection contre les suppressions destructrices, et les résultats des outils sur tools/post-execute. Ce dernier point est le plus intéressant, car c’est là que le contenu récupéré depuis une page web est contrôlé avant que le modèle n’agisse dessus.
dsh plugin --profile web add "github:PerryLink/dsh-defend#7ba3427"Les valeurs par défaut sont prudentes plutôt que strictes : detection.injectionAction, detection.jailbreakAction et detection.secretAction valent tous ask, tandis que detection.secretBlockCritical vaut true. Un secret critique est donc bloqué quels que soient les autres paramètres. Sur une machine sans supervision, définissez sur block les actions qui vous intéressent, car ask sans personne à qui demander confirmation ne constitue pas une décision.
La conception de l’audit est bien pensée. Les événements defend/detection enregistrent l’identifiant de la règle, la famille, la catégorie, la gravité, la décision et les informations du scan, mais jamais le texte détecté. Les secrets sont enregistrés uniquement par type. L’activation du journal d’audit ne crée donc pas une deuxième copie de l’identifiant que vous essayiez de protéger.
Il faut bien comprendre ce que cela apporte. La détection repose sur des règles, et le README indique clairement que des formulations inédites et des attaques en plusieurs étapes peuvent lui échapper. Elle réduit la fréquence des attaques évidentes. Elle ne permet pas d’utiliser sans risque un agent avec du contenu non fiable. Conservez donc les règles de permission qui s’appliquent en dessous.
dsh-memory : que retiendra l’agent demain ?
Deux plugins différents s’appellent dsh-memory. Il est utile de le savoir avant de saisir une commande d’installation. Installez-le en indiquant explicitement la source, afin d’obtenir celui que vous avez consulté.
Pour un petit serveur, je choisirais la version SQLite. Elle s’enregistre sous le nom memory, stocke les données dans un seul fichier à l’emplacement $DSH_HOME/memory/memory.db, partagé entre les profils, et expose memory_write, memory_search et memory_forget. La recherche porte sur des mots-clés dans le texte et les tags enregistrés. Aucun service d’embedding, aucune clé API et aucun processus supplémentaire ne sont nécessaires.
dsh plugin --profile web add "github:ben7am1n/dsh-memory#def7c6a"La configuration à modifier est limitée : path pour le fichier de base de données, promptRecentCount (valeur par défaut : 10) pour le nombre de souvenirs non épinglés à injecter, et promptMaxChars (valeur par défaut : 2000) pour le budget de rendu. Elle s’appuie sur node:sqlite, que Node 22 et 24 marquent encore comme expérimental. Une mise à niveau de Node doit donc être testée, et non considérée comme acquise.
Voici ce que la mémoire change concrètement sur la machine : les souvenirs injectés sont ajoutés au system prompt à chaque tour. Un budget de 2000 caractères représente quelques centaines de tokens d’entrée supplémentaires à chaque requête, en permanence. Cela apparaît directement sur votre facture. C’est pourquoi dsh-budget doit être installé sur la machine avant dsh-memory. Gardez promptMaxChars à une valeur basse et nettoyez les données avec memory_forget au lieu de laisser le fichier grossir.
L’autre version stocke les souvenirs dans un fichier YAML et utilise une recherche par embeddings avec injection automatique dans le prompt. Elle s’installe avec dsh plugin --profile web add github:towzai/dsh-memory. Elle nécessite une instance locale d’ollama et un modèle d’embedding, qwen3-embedding:0.6b par défaut, que vous pouvez remplacer avec DSH_MEMORY_EMBED_MODEL. Le rappel sémantique est meilleur que le rappel par mots-clés. Cette solution ajoute toutefois un second service et un ensemble de poids de modèle résidents sur le même serveur. Sur une petite offre, cette mémoire est prise sur les ressources que vous avez loué le serveur pour utiliser. Choisissez cette version si vous disposez de suffisamment de RAM. Le compromis général entre la qualité du rappel et le coût en ressources résidentes est présenté dans la mémoire locale pour les agents.
dsh-web-lan-access : l’interface web doit-elle écouter au-delà de loopback ?
npx @deepseek-ai/dsh web sert l’interface sur 127.0.0.1:3080. Les navigateurs n’exposent crypto.randomUUID() que dans un contexte sécurisé ; charger cette même page en HTTP simple depuis une autre machine échoue donc. dsh-web-lan-access corrige ce problème en utilisant webServer.tapIndex pour injecter un petit polyfill, puis modifie l’adresse d’écoute du serveur pour utiliser 0.0.0.0.
Lisez son avertissement avant de l’installer. Une écoute sur 0.0.0.0 rend l’agent accessible sans authentification à toute personne présente sur le même réseau local (LAN). Sur un serveur doté d’une adresse IP publique, cela signifie l’ensemble d’Internet. Une courte liste de méthodes sensibles (settings.*, credentials.*, llm.discoverModels) reste liée à loopback et renvoie 403 pour les origines distantes, ce qui limite les dommages. Cela ne les empêche pas, car la surface d’appel des outils reste ouverte à toute personne qui découvre le port.
La plupart du temps, vous n’avez pas besoin de ce plugin. Transférez plutôt le port avec SSH.
ssh -N -L 3080:127.0.0.1:3080 you@your-serverOuvrez ensuite http://127.0.0.1:3080 dans votre navigateur local. Le harness continue d’écouter uniquement sur loopback : rien n’est exposé. De plus, les navigateurs considèrent 127.0.0.1 comme une origine sécurisée, donc crypto.randomUUID() est disponible et aucun polyfill n’est nécessaire. Une commande, aucun plugin et aucune nouvelle surface d’attaque.
N’installez le plugin que lorsqu’un transfert de port ne convient pas, par exemple si un téléphone du même réseau doit accéder à l’interface. Dans ce cas, liez-le à une interface réseau privée, conservez une règle de pare-feu qui n’autorise que cette interface et indiquez les noms à utiliser sous trustedHosts dans l’entrée web-runtime. Pour un véritable accès multi-utilisateur, vous pouvez utiliser dsh-passwords. Il ajoute des permissions par sous-utilisateur, des quotas horaires de tokens et des quotas quotidiens de temps pour chaque sous-utilisateur, des certificats TLS (transport layer security) automatiques via Let's Encrypt, ainsi qu’un journal d’audit chiffré. Considérez-le comme une plateforme plutôt que comme un plugin : il requiert les ports 80 et 443, fournit son propre installateur et la procédure rapide documentée transmet directement un script shell du réseau à bash. Préférez npm install -g dsh-passwords, puis dsh-passwords install, afin que le code soit enregistré sur le disque et puisse être lu avant son exécution.
Comment supprimer proprement un plugin
La désinstallation se fait en deux étapes, mais la seconde est souvent oubliée.
dsh plugin --profile web remove dsh-budget
dsh plugin --profile web listlist ne doit plus l’afficher. Ouvrez ensuite $DSH_HOME/profiles/web/cordis.patch.yml et supprimez tout bloc d’insertion restant qui mentionne ce plugin, car c’est cette entrée qui le charge dans l’arborescence. Redémarrez le harness pour reconstruire l’arborescence ; un plugin déjà chargé reste chargé jusqu’à cette opération. Enfin, n’oubliez pas que les données persistent au-delà du code. $DSH_HOME/memory/memory.db et .dsh/rules.yaml restent présents après la désinstallation. Supprimez-les vous-même si la suppression des données était l’objectif.
Ce que j’ai consulté et à quel moment
Toutes les références ci-dessous pointent vers un commit, pas vers une branche, car main contiendra un code différent au moment où vous lirez ceci. J’ai tout consulté le 17 août 2026, et le harness lui-même était en version 0.1.0-rc.7 sur npm ce jour-là.
Commits exacts correspondant à cette sélection
- La liste des plugins de la communauté en
f2918fb, le 17 août 2026. Lien ajouté volontairement une seule fois. Il s’agit d’un annuaire, pas d’une recommandation. - dsh-budget en
461d478, le 17 août 2026. Apache 2.0. Déclare dsh0.1.0-rc.6, Node 22.19 ou 24 et versions ultérieures. - dsh-permission-rules en
b30b4fb, le 17 août 2026. Apache 2.0. Déclare dsh0.1.0-rc.5à0.1.0-rc.6. - dsh-defend en
7ba3427, le 17 août 2026. Apache 2.0. Déclare dsh0.1.0-rc.6. - dsh-memory en
def7c6a, le 13 août 2026. MIT. Build SQLite. - dsh-web-lan-access en
e27e909, le 16 août 2026. MIT.
Vérifiez à nouveau ces références avant de copier une commande. Dans un écosystème en developer preview, un numéro de version associé à une date est le seul qui ait une signification.
FAQ
Quels plugins DeepSeek Harness dois-je installer en premier sur un VPS ?
Installez dsh-budget et dsh-permission-rules avant tout le reste. Un budget avec overLimit: block empêche une exécution sans surveillance de dépenser toute la nuit, et un fichier .dsh/rules.yaml bloque un appel d’outil que vous n’auriez jamais validé. Ajoutez dsh-defend dès que l’agent lit du contenu provenant du Web public, et dsh-memory lorsque vous constatez que vous collez le même contexte dans chaque session. Ignorez les thèmes et les indicateurs d’état : ils ajoutent du code exécuté avec les privilèges de l’agent sans modifier le fonctionnement de la machine.
Les plugins dsh sont-ils isolés du harness ?
Non. Un plugin se charge dans le même arbre Cordis que le harness, dans le même processus, avec le même utilisateur du système d’exploitation, les mêmes identifiants du modèle et le même arbre de travail. Un plugin qui intercepte tools/pre-execute voit chaque appel d’outil et peut le bloquer ; un plugin qui intercepte agent/pre-step voit vos messages. Lisez donc le code source, vérifiez la licence et la date du dernier commit, puis installez le plugin à partir d’un commit plutôt que d’une branche afin que le code ne puisse pas changer à votre insu.
dsh-budget arrêtera-t-il réellement l’agent ou m’enverra-t-il seulement un avertissement ?
Cela dépend de overLimit. La valeur par défaut est alert : un avertissement est affiché à warnRatio, mais les dépenses continuent. block refuse les appels supplémentaires au modèle une fois le plafond atteint, et /budget unblock <scope> le lève lorsque vous choisissez de continuer. degrade bascule vers un modèle moins coûteux de la map degradation. Une limite reste importante : les totaux sont agrégés dans le processus en cours à partir du flux d’événements de la session. Le redémarrage du harness les réinitialise donc, et une boucle de redémarrage contournera un plafond quotidien. Conservez une limite de dépenses sur le compte du fournisseur pour définir le véritable plafond.
Comment supprimer complètement un plugin dsh ?
Exécutez dsh plugin --profile web remove <package-name>, confirmez avec dsh plugin --profile web list, puis ouvrez $DSH_HOME/profiles/web/cordis.patch.yml et supprimez tout bloc d’insertion restant pour ce plugin, car c’est cette entrée qui le charge. Redémarrez le harness afin de reconstruire l’arbre des plugins. Les données écrites par le plugin restent sur le disque : $DSH_HOME/memory/memory.db et .dsh/rules.yaml persistent tous les deux après la désinstallation, jusqu’à ce que vous les supprimiez vous-même.
Est-il sûr d’exposer l’interface web dsh sur le réseau ?
Pas sans configuration supplémentaire. dsh web écoute sur 127.0.0.1:3080, et dsh-web-lan-access modifie cette liaison pour utiliser 0.0.0.0. Son README précise que l’agent devient alors accessible sans authentification à toute personne présente sur le même réseau ; avec une adresse IP publique, cela signifie Internet. Quelques méthodes (settings.*, credentials.*, llm.discoverModels) restent limitées à la loopback et renvoient 403 aux origines distantes, ce qui réduit les risques sans résoudre complètement le problème. Utilisez un tunnel de port SSH, ssh -N -L 3080:127.0.0.1:3080 you@your-server, ou placez le port derrière une interface réseau privée et une règle de pare-feu. Ajoutez une véritable authentification avant toute exposition externe.