# DSH review: DeepSeek Harness getest | Apps

[Naar de inhoud](#lm-inhoud)Netwerk/NL[EN](/en/)[Hubhub.llmnet.nlModellen vergelijken op taak, taal, kosten en licentie.](https://hub.llmnet.nl/)[Communitycommunity.llmnet.nlPrompttechnieken, patronen en systeemprompts.](https://community.llmnet.nl/)[APIapi.llmnet.nlLLM's robuust in software: rate limits, routing, structured output.](https://api.llmnet.nl/)[Consultancyconsultancy.llmnet.nlAI invoeren in een organisatie, van pilot tot productie.](https://consultancy.llmnet.nl/)[Nieuwsnieuws.llmnet.nlOntwikkelingen in AI, geduid voor Nederland.](https://nieuws.llmnet.nl/)[Benchmarkbenchmark.llmnet.nlZelf meten wat AI-kwaliteit is, voor jouw taken.](https://benchmark.llmnet.nl/)[Vacaturesvacatures.llmnet.nlAI-rollen, salarissen en carrièrepaden in Nederland.](https://vacatures.llmnet.nl/)[Lerenleren.llmnet.nlAI-concepten in gewoon Nederlands, van beginner tot bouwer.](https://leren.llmnet.nl/)[Gidsgids.llmnet.nlAI privé draaien op eigen Mac, pc, NAS of thuisserver.](https://gids.llmnet.nl/)[Directorydirectory.llmnet.nlHet AI-ecosysteem in kaart: tools, modellen, bedrijven.](https://directory.llmnet.nl/)[Radarradar.llmnet.nlSignalen uit X, onderzoek en communities voor indie developers.](https://radar.llmnet.nl/)[Appsapps.llmnet.nlReviews van AI-apps en open-source repo's, met tips voor wie zelf bouwt.](https://apps.llmnet.nl/)[llmnet.nl — hoofdsite](https://llmnet.nl/)[](https://x.com/intent/post?url=https%3A%2F%2Fapps.llmnet.nl%2Fdsh-review&text=DSH%20review%3A%20DeepSeek%20Harness%20getest%2C%20167.000%20sterren%20in%20elf%20dagen)[](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fapps.llmnet.nl%2Fdsh-review)[](https://www.reddit.com/submit?url=https%3A%2F%2Fapps.llmnet.nl%2Fdsh-review&title=DSH%20review%3A%20DeepSeek%20Harness%20getest%2C%20167.000%20sterren%20in%20elf%20dagen)[](#)
 
 
 [← Terug naar Software & repo-reviews](/software)
 
 
 
# DeepSeek Harness getest: alles is een plugin, en dat is geen marketing

 Gepubliceerd op 21 augustus 2026 · Getest: @deepseek-ai/dsh 0.1.0-rc.6 op een Mac mini M1 (Node 22.23) · Repo-review, geen affiliate

 
 Wat dit stuk wel en niet is. Ik draai DSH sinds 14 augustus als
 permanente webdienst op mijn eigen machine, gekoppeld aan mijn eigen modelrouter in plaats
 van rechtstreeks aan DeepSeek. Alle cijfers hieronder heb ik zelf nagemeten op 21 augustus
 2026; de twee bugs heb ik zelf gereproduceerd en opgelost. Wat ik niet heb getest, staat
 erbij. Dit is een open-source repo, dus er zit geen affiliate-link in dit artikel —
 alleen een link naar de broncode.

 

 
## Wat DSH is

 DeepSeek Harness — commando dsh — is het agentraamwerk dat DeepSeek
 zelf onder MIT-licentie heeft vrijgegeven. Het is geen model en geen chatvenster, maar de
 laag ertussen: sessiebeheer, tools, geheugen, subagents, planmodus, skills, een webinterface
 en een headless modus. Vergelijk het met Claude Code of OpenAI Codex, maar dan als bouwdoos
 waarvan elk onderdeel vervangbaar is.

 Het motto op de repo is Everything is a Plugin. Dat klinkt als een slogan, en dat
 was ook mijn eerste reactie. Het bleek letterlijk waar te zijn, en dat is het interessantste
 aan dit project.

 
## Eerst de cijfers, want die vertellen twee verhalen

 
 Meting (21 augustus 2026) | Waarde | 

 
 Sterren op GitHub | 167.000 | 

 Forks | 17.700 | 

 Watchers | 704 | 

 Eerste npm-publicatie | 10 augustus 2026, 21:41 | 

 Aantal releases sindsdien | 8 | 

 Nieuwste versie | 0.1.0-rc.7 (next: 0.1.0-rc.8) | 

 Downloads 10–19 augustus | 648.038 | 

 Piekdag (17 augustus) | 130.993 | 

 Licentie | MIT | 

 
 

 Het eerste verhaal is adoptie: ruim zeshonderdduizend downloads in zeven actieve dagen is
 geen bubbel, dat zijn mensen die het echt installeren. Het tweede verhaal is leeftijd. Dit
 project is elf dagen oud. Acht releases in negen dagen, en de repo noemt
 zichzelf onomwonden een developer preview met te verwachten breuken.

 Die 167.000 sterren zeggen dus vrijwel niets over volwassenheid. Ze zeggen iets over de
 naam DeepSeek. De verhouding is trouwens veelzeggend: 167.000 sterren tegenover 704 watchers.
 Sterren zijn een applausmeter, watchers zijn mensen die de commits daadwerkelijk willen
 volgen. Bij een project dat je in productie zet, is dat tweede getal het eerlijkere.

 
## Installeren duurt een commando

 npx @deepseek-ai/dsh web
# webinterface op http://127.0.0.1:3080

 Meer is het niet. Je hebt Node nodig (ik draai 22.23) en voor eigen plugins ook pnpm.
 Wat mij positief opviel bij het nameten: de server luistert alleen op 127.0.0.1,
 niet op alle interfaces. Voor een tool die shell-commando’s mag uitvoeren is dat de juiste
 standaardkeuze — wil je hem toch vanaf een andere machine bereiken, doe dat dan met een
 tunnel en niet door de binding open te zetten, zoals beschreven in
 [lokale LLM-servers veilig in je
 netwerk](https://gids.llmnet.nl/lokale-llm-netwerk-beveiliging): dezelfde afweging geldt hier, met als verschil dat DSH niet alleen antwoordt maar
 ook je bestandssysteem aanraakt.

 
 
 De webinterface op 127.0.0.1:3080, hier met mijn eigen modelrouter als
 backend — rechtsonder staat DeepSeek-V4-Pro (router) in plaats van de standaardoptie.
 Het label Preview naast de titel is geen bescheidenheid maar een waarschuwing.
 

 De interface is rustig en doet weinig verrassends: workspaces links, sessies eronder,
 onderin een keuze voor modus (standaard, plan) en schrijfrechten (Workspace Write). Wie Claude
 Code of Cursor kent, is binnen een minuut thuis. Er is geen desktop-app; de webinterface
 is de app.

 
## Alles is een plugin — hier is het bewijs

 Ik heb de samengestelde configuratie van mijn webprofiel laten uitdraaien. Dat levert een
 lijst op van 129 plugins die samen vormen wat je op je scherm ziet. Niet 129
 optionele extra’s: de sessie zelf, de agent zelf, de titelgenerator, elke tool, de
 telemetrielaag — allemaal plugins in dezelfde lijst.

 $ dsh --profile web --dump-config
# == @deepseek-ai/dsh-base
- id: llm
 name: '@deepseek-ai/dsh-llm'
- id: session
 name: '@deepseek-ai/dsh-session'
- id: agent
 name: '@deepseek-ai/dsh-agent'
# == @deepseek-ai/dsh-base, patched by $DSH_HOME/profiles/web/cordis.patch.yml
...

 Let op de commentaarregels. Bij elke plugin staat uit welke bundel hij komt en welke laag
 hem daarna heeft aangepast. Dat is een klein detail met grote gevolgen: als je gedrag ziet dat
 je niet verwacht, wijst de configuratie zelf aan wie het heeft veroorzaakt. Ik heb weinig
 frameworks gezien die dat zo netjes doen.

 De opbouw is een stapel patch-lagen. Een profiel is een map met een package.json
 (welke bundels, in welke volgorde) en een cordis.patch.yml (jouw eigen aanpassingen).
 Die worden over elkaar heen gelegd: eerst de bundels op volgorde, dan jouw profiel-patch, dan de
 patch op home-niveau, dan wat je via --patch meegeeft. Met
 --dump-default-config zie je de stand zonder jouw lagen, met --dump-config
 de stand mét. Verschil zoeken tussen die twee is meteen je debugmethode.

 In de praktijk betekent dat dit. Ik wilde DSH niet rechtstreeks naar DeepSeek laten praten,
 maar via mijn eigen router, zodat het verbruik in mijn kostenboekhouding landt en er automatisch
 een fallback-keten achter zit. Dat kostte elf regels YAML in één patchbestand:

 - id: llm-deepseek
 config:
 baseURL: http://router.intern:8093/v1
 models:
 - id: deepseek/deepseek-v4-pro
 name: DeepSeek-V4-Pro (router)
- id: agent-default-model
 config:
 provider: deepseek-official
 model: deepseek/deepseek-v4-pro

 Geen fork, geen gepatchte node_modules, geen omgevingsvariabele-goochelarij. Waarom je dat
 zou willen — en wat een routerlaag oplevert aan kosten en uitwijk — heb ik eerder
 uitgewerkt in [AI-taken
 slim uitbesteden via een proxy en routering](https://gids.llmnet.nl/deepseek-harness-kimi-claude-uitbesteding); dit artikel gaat over de harness zelf, dat
 artikel over de laag eronder.

 
## Presets en skills

 DSH levert vier agent-presets mee: minimal, standard,
 code en cordis. Elke preset is een map met een
 agent.cordis.yml en optioneel een skills/-map met
 SKILL.md-bestanden. Dat is dezelfde conventie als bij Claude, en dat is goed
 nieuws: instructiebestanden die je daar hebt opgebouwd, verhuizen zonder vertaalslag. Wat een
 instructiebestand wél en niet moet bevatten, staat in
 [CLAUDE.md die wel werkt](/claude-md-voorbeelden) — de vier patronen daaruit
 gelden hier één op één.

 Naast de webinterface is er een headless modus, en die is voor automatisering het
 interessantst:

 dsh --profile headless "draai de tests en vat de fouten samen"

 Eén verse sessie, één antwoord op stdout, exitcode ongelijk nul bij fouten. Dat is precies
 wat je nodig hebt om een agent in een cronjob of een CI-stap te hangen zonder een browser open
 te houden.

 
## Telemetrie: hoe het hoort

 Dit verdient een eigen kop, omdat ik het zelden zo goed geregeld zie. De telemetrielaag
 staat standaard op DISABLED en gaat alleen aan als je zelf
 DSH_TELEMETRY_MODE zet. In uitgeschakelde stand wordt de exportpijplijn niet
 eens gebouwd. Er is geen stille standaard, geen opt-out-na-installatie.

 Belangrijker nog: de documentatie heeft een kopje What leaves the machine dat
 zonder verbloeming opsomt wat er wél vertrekt zodra je hem aanzet — berichtinhoud,
 toolargumenten en -resultaten (dus commando-uitvoer en bestandsinhoud), de volledige
 systeemprompt, todo-teksten, en je werkmap als lokaal pad. Er zitten geen redactieregels in;
 die moet je zelf aanhangen. API-sleutels zitten er structureel niet in, omdat ze geen
 sessie-events zijn.

 
 Praktisch gevolg. Laat DSH_TELEMETRY_MODE met rust tenzij je
 een eigen OTLP-collector hebt draaien. Zet je hem op FULL zonder eigen
 redactieregels, dan stuur je de inhoud van de bestanden die de agent leest naar buiten. De
 makers zeggen dat eerlijk; de verantwoordelijkheid ligt daarna bij jou.

 

 
## Waar het misging: twee bugs uit de praktijk

 
### 1. Elke tool-aanroep mislukte met unknown tool ""

 Dit is de vervelendste, en hij treft precies de mensen die DSH voor iets serieus willen
 gebruiken. Zodra ik het model via mijn eigen OpenAI-compatibele endpoint aansprak, weigerde
 de agent iedere tool-aanroep. Niet af en toe: altijd. Via
 api.deepseek.com werkte hetzelfde model probleemloos.

 De oorzaak zit in de accumulator die streamende tool-aanroepen aan elkaar plakt. Bij
 streaming stuurt een provider de naam van de tool één keer mee, in het eerste stukje, en
 daarna null terwijl de argumenten binnendruppelen. Dat is toegestaan en komt veel
 voor. De controle in DSH keek echter alleen naar undefined:

 - if (call.function?.name !== void 0) block.name = call.function.name;
+ if (call.function?.name != null) block.name = call.function.name;

 Omdat null !== undefined waar is, werd de al bekende naam bij elk volgend
 stukje overschreven met null, en viel hij bij afronding terug op een lege string.
 De agent riep dus netjes een tool aan die niet bestond. Eén teken verschil —
 != in plaats van !== — en tool-gebruik werkte weer, end-to-end
 geverifieerd.

 Dat dit door de tests kwam zegt iets over de dekking: er wordt kennelijk getest tegen de
 eigen API en niet tegen de variantenrijkdom van het OpenAI-protocol. Wie zelf wil controleren
 of tool-aanroepen bij zijn opstelling betrouwbaar landen, vindt de meetmethode in
 [function
 calling-nauwkeurigheid testen bij complexe schema’s](https://benchmark.llmnet.nl/function-calling-nauwkeurigheid-testen-bij-complexe-schema-s); ik had die test eerder moeten
 draaien dan ik deed.

 
### 2. Certificaatfouten die alleen de agent trof

 De tweede was subtieler. De webtools van de agent kregen
 CERTIFICATE_VERIFY_FAILED bij GitHub, Reddit en Hacker News, terwijl
 curl vanaf dezelfde machine gewoon werkte. De oorzaak: elk tooltje pakte de
 certificatenbundel van de interpreter die toevallig vooraan in PATH stond, en
 onder launchd is dat een andere dan in je eigen terminal.

 De oplossing was niet in DSH maar eromheen — één verse bundel voor alles, gezet in
 het startscript:

 CERTIFI_PEM=$(python3 -c "import certifi;print(certifi.where())")
export SSL_CERT_FILE="$CERTIFI_PEM"
export REQUESTS_CA_BUNDLE="$CERTIFI_PEM"
export NODE_EXTRA_CA_CERTS="$CERTIFI_PEM"

 Dit is geen DSH-fout in strikte zin, maar het is wel het soort ding dat een raamwerk hoort
 op te vangen: als je tools laat draaien in een omgeving die jij zelf opbouwt, hoor je ook de
 TLS-wortels expliciet te zetten in plaats van te hopen dat PATH meewerkt. Reken
 erop dat je bij een dienst onder launchd of systemd zelf dit soort gaten dichtloopt.

 
## De kritische noot

 De documentatie is voor bijdragers geschreven, niet voor gebruikers. De
 README van het CLI-pakket verwijst naar src/args.ts en
 src/bin.ts — bestanden die in je installatie niet bestaan. De uitleg is
 technisch uitstekend en soms zelfs mooi precies, maar hij gaat ervan uit dat je de monorepo
 voor je hebt. Voor een project met zeshonderdduizend downloads is dat een gat.

 Het tempo is te hoog om ongepind te draaien. Acht releases in negen dagen,
 en het versienummer staat nog op 0.1.0-rc. Ik draai zelf rc.6 terwijl rc.7 al
 stabiel heet en rc.8 als next klaarstaat. Zet in je installatie een exacte versie
 vast en update pas als je tijd hebt om te testen, want het label developer preview betekent
 hier echt dat interfaces mogen breken.

 Er is geen ecosysteem, alleen een architectuur. Het pluginmodel is de
 belofte van dit project, maar op dit moment komen vrijwel alle 129 plugins van DeepSeek zelf.
 Of everything is a plugin meer wordt dan een intern ordeningsprincipe, hangt af van
 de vraag of derden er over een half jaar plugins voor publiceren. Dat is nu nog niet te zien.

 Wat ik niet heb getest. Ik heb de subagents, de workflow-worker en de
 planmodus alleen oppervlakkig aangeraakt, en ik heb DSH niet naast Claude Code of Codex gezet
 in een eerlijke vergelijking op dezelfde taak. Dat laatste is een aparte meting waard;
 een raamwerk beoordelen op een handvol sessies is precies de fout die ik in reviews van
 anderen aanwijs.

 
## Voor wie is dit

 Wel: je bouwt zelf aan agent-infrastructuur, je wilt kunnen zien en
 veranderen wat er in de laag tussen model en tool gebeurt, en je vindt het prettig dat een
 routerwissel elf regels YAML kost in plaats van een fork. Ook: je wilt een agent headless in
 een cronjob hangen zonder aan een abonnement vast te zitten.

 Niet: je wilt vandaag productiewerk afleveren en hebt geen zin om zelf
 bugs op te sporen in een elf dagen oude codebase. Neem dan iets wat een jaar in de wind heeft
 gestaan, en kom over drie maanden terug.

 
## Oordeel

 DeepSeek Harness is het best doordachte agentraamwerk dat ik dit jaar heb opengeklapt, en
 tegelijk het jongste. De architectuur is geen slogan: 129 plugins in één lijst, met per plugin
 zichtbaar welke laag hem heeft aangepast, en een telemetrielaag die standaard uit staat en
 eerlijk opschrijft wat hij zou versturen. Dat zijn keuzes van mensen die weten wat ze doen.

 Daar staat tegenover dat ik in één week twee blokkerende problemen tegenkwam, waarvan er
 één elk tool-gebruik onmogelijk maakte zodra je niet rechtstreeks met DeepSeek praat. Dat is
 geen ramp voor een developer preview — het is precies wat het label belooft. Het is wel
 de reden om dit project nu te volgen en niet te vertrouwen.

 
 Praktisch
 Repo:
 [github.com/deepseek-ai/deepseek-harness](https://github.com/deepseek-ai/deepseek-harness)
 · MIT-licentie · TypeScript
 Installeren: npx @deepseek-ai/dsh web · vereist Node
 (getest met 22.23), pnpm voor eigen plugins
 Getest: 0.1.0-rc.6 op macOS (Apple Silicon), 14–21 augustus 2026
 Kosten: de harness is gratis; je betaalt alleen het model dat je eronder
 hangt

 Geen affiliate-link: dit is open-source software en er valt hier niets
 te verdienen. Wat er hierboven staat, is nagemeten op mijn eigen machine op de datum in de
 kop; ga het na voordat je er iets op baseert.
