217 000 étoiles pour le dépôt GitHub de DeepSeek Harness au moment où j'écris cet article. Dans l'article sur les harnais en IA, j'avais promis de faire un guide sur cet outil, c'est chose faite !
C'est quoi DeepSeek Harness ?
Publié par DeepSeek (ah ouais vraiment ?! 😛), DeepSeek Harness (dsh pour les intimes) est sorti le 13 août 2026 sous licence MIT.
N'hésitez pas à relire notre article sur les harnais, mais pour résumer, c'est tout ce qui entoure le modèle pour en faire un agent.
DeepSeek Harness se distingue par sa philosophie et son architecture : chaque brique qui compose le harnais est un plugin. L'outil repose sur le framework Cordis.
dsh n'est pas figé. En effet, au démarrage, il assemble des plugins en fonction du profil choisi. Les profils partagent le même cœur, mais se distinguent par la façon dont on communique avec l'agent. Pour cet article, on en utilisera deux :
-
web : depuis le navigateur
-
sdk : depuis un programme, ce qu'utilise le SDK Python
Vous pouvez même créer votre propre profil.
À noter
Le projet est en developer preview, alors il faut s'attendre à quelques changements dans les semaines/mois qui arrivent.
Comment installer DeepSeek Harness ?
Il faut avoir Node.js d'installé et une clé API. Dans notre cas, on va utiliser une clé DeepSeek : bien que le harnais accepte d'autres fournisseurs, le modèle par défaut est un modèle DeepSeek.
Dans votre terminal, exécutez la commande suivante :
npx @deepseek-ai/dsh web
La commande démarre un serveur web et ouvre votre navigateur.
DeepSeek Harness Web
Il est maintenant temps d'aller récupérer une clé API DeepSeek.
Récupérer la clé API DeepSeek
Par la suite, si vous voulez ajouter d'autres modèles, vous passerez par Settings => Models.
Changer de fournisseur
Cliquez sur Choose workspace pour sélectionner le dossier depuis lequel vous avez lancé la commande. Pour ma part, je vais sélectionner un projet Wagtail (gestion d'évènements, avec système de réservations, documents, photos, etc.).
Trois modes d'accès :
-
Read Only : l'agent peut lire les fichiers sans les modifier
-
Workspace Write : il peut lire et écrire
-
Full access : open bar
Dans les deux premiers modes, les commandes de l'agent ne sont pas lancées directement : le système d'exploitation les bride pour que l'agent ne puisse écrire que dans le workspace. En full access, ce garde-fou n'est pas mis en place, et l'agent n'a plus de périmètre.
Les différents modes
Commençons par un premier prompt pour une tâche en lecture seule :
Résume ce dépôt et liste ses principaux fichiers.
Résultat (partie 1)
Résultat (partie 2)
Je vais maintenant le passer en mode Workspace Write, car je veux améliorer une fonctionnalité : mon système de réservation.
Je veux pouvoir corriger une réservation déjà saisie sur le tableau des réservations (passer 15 menus adultes à 16). Avant de coder : lis le code concerné et dis-moi quels cas limites tu vois et ce que tu comptes faire.
Analyse du modèle (partie 1)
Analyse du modèle (partie 2)
À noter
Vous pouvez changer de modèle, et même sélectionner le niveau d'effort de votre agent.
Choix du modèle et de l'effort
Je décide de passer à l'implémentation 😎.
L'agent en plein travail
L'agent se donne une liste de tâches et les coche au fur et à mesure, tout en respectant mes conventions.
Où DeepSeek Harness stocke-t-il ses données ?
Ce que DeepSeek Harness persiste se trouve dans ~/.dsh. Voici ce qu'on y trouve :
/Users/gabrieltrouve/.dsh ├── .anonymous-user-id ├── .credentials.yaml ├── profiles │ └── web │ ├── .dsh-module-fallback │ ├── cordis.patch.yml │ ├── cordis.yml │ ├── package.json │ └── pnpm-workspace.yaml ├── sessions │ └── --Users-gabrieltrouve-Pro-cdf-- │ └── session-8ed9c977-0128-49b6-8e54-0c82fbfd4c09 │ ├── session.lock │ └── session.v3.jsonl.zstd ├── settings.yaml └── storages ├── session_projcache │ └── sessions │ └── session-8ed9c977-0128-49b6-8e54-0c82fbfd4c09.json └── workspace.json
Le fichier .credentials.yaml conserve la clé, tandis que settings.yaml regroupe vos réglages. J'imagine que vous avez deviné que profiles/ contient un dossier par profil utilisé et que sessions/ range les journaux par workspace. Je n'affiche pas le dossier node_modules pour éviter le mal de crâne.
Comment fonctionnent les plugins ?
Rappelez-vous, tout est plugin. Ouvrez Settings => Plugins : l'onglet regroupe les briques réglables. L'onglet Plugin list affiche les 156 plugins globaux partagés par toutes les sessions, et les 28 plugins de session.
Plugins
Le menu de gauche contient l'entrée Agent presets. Un preset est un assemblage tout fait de ces 28 plugins de session :
-
Standard pour l'usage courant
-
Code pour les tâches répétitives
-
Minimal pour tester
-
Creator pour composer le vôtre
Le choix du preset ne touche pas aux droits de l'agent, mais aux outils dont il dispose.
Pour installer un plugin tiers, la commande est dsh plugin --profile web add <paquet> (pour notre cas ça sera un peu différent, vous le verrez juste en dessous). Maintenant, il faut savoir quoi installer. Vous en retrouverez sur GitHub, il existe même un catalogue awesome-dsh-plugin.
Essayons le plugin dsh-context, qui ajoute un tableau de bord du contexte et une commande /context.
npx @deepseek-ai/dsh plugin --profile web add dsh-context
Il faut ensuite arrêter le serveur dans le terminal et relancer npx @deepseek-ai/dsh web. Vous ne perdez rien, car votre session est conservée.
Le plugin est bien présent
Le plugin en action
Il existe même un tutoriel pour écrire votre propre plugin 😁.
Attention
Un plugin exécute du code tiers sur votre PC.
Savoir ce que fait l'agent
DeepSeek Harness permet de voir ce que fait l'agent. Dans l'interface, l'onglet Trajectory affiche la session sous forme de registre.
Onglet Trajectory
On y retrouve les messages de l'utilisateur, les réponses et les appels d'outils. En réalité, l'onglet lit un fichier que vous pouvez récupérer avec /export ou Download session log dans le menu.
Download session log
Changer de modèle
Changeons de modèle pour utiliser Mistral. Allez récupérer une clé API, puis renseignez-la dans les Settings.
Renseigner la clé Mistral
Le tour est joué !
Choix des modèles
Vous avez maintenant le choix des modèles que Mistral fournit, en plus des modèles DeepSeek.
Utiliser un modèle en local
Je vous invite tout d'abord à aller lire notre guide sur comment faire tourner une IA en local avec Ollama. Ensuite, je vais télécharger un modèle :
ollama pull qwen3:4b
Tout se fait dans l'interface de DeepSeek Harness, dans Add a custom provider :
Utiliser une IA en local
L'API d'Ollama est compatible avec celle d'OpenAI. Pour la clé API, j'ai simplement mis ollama.
Le harnais envoie à chaque requête un prompt système conséquent avec tous ses outils. Pas le choix que d'élargir la fenêtre : quittez Ollama, puis relancez-le de cette manière :
OLLAMA_CONTEXT_LENGTH=16384 ollama serve
En toute honnêteté, sur mon Mac et ses 8 Go, ça n'a pas été simple. Sur un dépôt d'un fichier Shelly Script et un Readme, il a fallu sept minutes à Qwen pour répondre à « que fait ce projet ? ».
Morale de l'histoire : pour du code en local, il faut une machine bien plus costaude que mes 8 Go et un modèle bien plus gros.
Et avec Python ?
Forcément, j'avais envie de faire le lien entre DeepSeek Harness et Python. Et ça tombe bien, il existe un SDK officiel. J'ai créé un projet et je l'ai installé avec :
uv add deepseek-harness-sdk # ou si vous préférez : pip install deepseek-harness-sdk
Le SDK embarque son propre Node.js, du coup vous n'avez besoin de rien d'autre.
J'ai créé un fichier main.py dans lequel j'utilise un script :
from pathlib import Path from deepseek_harness import DeepSeekHarness workspace = Path("/Users/gabrieltrouve/Pro/deepseekh").resolve() dsh_home = Path("/Users/gabrieltrouve/Pro/deepseekh/.dsh").resolve() with DeepSeekHarness( provider="deepseek-official", model="deepseek-v4-flash", cwd=str(workspace), dsh_home=str(dsh_home), ) as harness: resultat = harness.run("Liste les fichiers du projet", session_id="demo-008") print(resultat.final_response) print(resultat.finish_reason) print(len(resultat.events), "événements")
On demande au LLM de lister les fichiers du projet. La clé API doit être dans la variable d'environnement DEEPSEEK_API_KEY.
Résultat du script
Attention
Pour ma part, je passe la clé directement dans la commande, mais vous pouvez passer par un .env. Gardez bien cette clé secrète ! La mienne a déjà été révoquée juste après la capture d'écran 😛.
Pour aller plus loin, n'hésitez pas à aller voir le guide officiel du SDK Python.