DeepSeek Harness getest: alles is een plugin, en dat is geen marketing
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: dezelfde afweging geldt hier, met als verschil dat DSH niet alleen antwoordt maar
ook je bestandssysteem aanraakt.
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; 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 — 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; 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.
Repo:
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